1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

Fix potential deadlock when agent is closed

If the qemuAgentClose method is called from a place which holds
the domain lock, it is theoretically possible to get a deadlock
in the agent destroy callback. This has not been observed, but
the equivalent code in the QEMU monitor destroy callback has seen
a deadlock.

Remove the redundant locking while unrefing the object and the
bogus assignment

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-09-26 16:23:24 +01:00
parent 5cbb0d37d4
commit 362d04779c

View File

@ -129,7 +129,8 @@ qemuProcessHandleAgentEOF(qemuAgentPtr agent,
virDomainObjLock(vm);
priv = vm->privateData;
priv->agent = NULL;
if (priv->agent == agent)
priv->agent = NULL;
virDomainObjUnlock(vm);
qemuDriverUnlock(driver);
@ -167,16 +168,9 @@ qemuProcessHandleAgentError(qemuAgentPtr agent ATTRIBUTE_UNUSED,
static void qemuProcessHandleAgentDestroy(qemuAgentPtr agent,
virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv;
VIR_DEBUG("Received destroy agent=%p vm=%p", agent, vm);
virDomainObjLock(vm);
priv = vm->privateData;
if (priv->agent == agent)
priv->agent = NULL;
if (virObjectUnref(vm))
virDomainObjUnlock(vm);
virObjectUnref(vm);
}