Avoid invoking the qemu monitor destroy callback if the constructor fails

Some, but not all, codepaths in the qemuMonitorOpen() method
would trigger the destroy callback. The caller does not expect
this to be invoked if construction fails, only during normal
release of the monitor. This resulted in a possible double-unref
of the virDomainObjPtr, because the caller explicitly unrefs
the virDomainObjPtr  if qemuMonitorOpen() fails

* src/qemu/qemu_monitor.c: Don't invoke destroy callback from
  qemuMonitorOpen() failure paths
This commit is contained in:
Daniel P. Berrange 2010-06-29 11:57:54 +01:00
parent adc796c8eb
commit 8134d396fe

View File

@ -198,7 +198,7 @@ void qemuMonitorUnlock(qemuMonitorPtr mon)
static void qemuMonitorFree(qemuMonitorPtr mon) static void qemuMonitorFree(qemuMonitorPtr mon)
{ {
VIR_DEBUG("mon=%p", mon); VIR_DEBUG("mon=%p", mon);
if (mon->cb->destroy) if (mon->cb && mon->cb->destroy)
(mon->cb->destroy)(mon, mon->vm); (mon->cb->destroy)(mon, mon->vm);
if (virCondDestroy(&mon->notify) < 0) if (virCondDestroy(&mon->notify) < 0)
{} {}
@ -671,6 +671,12 @@ qemuMonitorOpen(virDomainObjPtr vm,
return mon; return mon;
cleanup: cleanup:
/* We don't want the 'destroy' callback invoked during
* cleanup from construction failure, because that can
* give a double-unref on virDomainObjPtr in the caller,
* so kill the callbacks now.
*/
mon->cb = NULL;
qemuMonitorUnlock(mon); qemuMonitorUnlock(mon);
qemuMonitorClose(mon); qemuMonitorClose(mon);
return NULL; return NULL;