diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c index e765c16711..0b18a14a89 100644 --- a/src/lxc/lxc_monitor.c +++ b/src/lxc/lxc_monitor.c @@ -161,6 +161,13 @@ virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm, if (virNetClientRegisterAsyncIO(mon->client) < 0) goto error; + /* avoid deadlock by making this call before assigning virLXCMonitorEvents */ + virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon, + virLXCMonitorCloseFreeCallback); + + /* close callback now has its own reference */ + virObjectRef(mon); + if (!(mon->program = virNetClientProgramNew(VIR_LXC_MONITOR_PROGRAM, VIR_LXC_MONITOR_PROGRAM_VERSION, virLXCMonitorEvents, @@ -175,10 +182,6 @@ virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm, mon->vm = virObjectRef(vm); memcpy(&mon->cb, cb, sizeof(mon->cb)); - virObjectRef(mon); - virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon, - virLXCMonitorCloseFreeCallback); - cleanup: VIR_FREE(sockpath); return mon;