From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> The virLXCControllerClientCloseHook method was mistakenly assuming that the private data associated with the network client was the virLXCControllerPtr. In fact it was just a dummy int, so we were derefencing a bogus struct. The frequent result of this was that we would never quit, because we tried to arm a non-existant timer. Fix the code by removing the dummy private data and just using the virLXCControllerPtr instance as private data Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/lxc/lxc_controller.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 6fffd68..a9d2d40 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -578,19 +578,14 @@ static void virLXCControllerClientCloseHook(virNetServerClientPtr client) static void virLXCControllerClientPrivateFree(void *data) { - VIR_FREE(data); + virLXCControllerPtr ctrl = data; + VIR_DEBUG("Got private data free %p", ctrl); } static void *virLXCControllerClientPrivateNew(virNetServerClientPtr client, void *opaque) { virLXCControllerPtr ctrl = opaque; - int *dummy; - - if (VIR_ALLOC(dummy) < 0) { - virReportOOMError(); - return NULL; - } virNetServerClientSetCloseHook(client, virLXCControllerClientCloseHook); VIR_DEBUG("Got new client %p", client); @@ -600,7 +595,7 @@ static void *virLXCControllerClientPrivateNew(virNetServerClientPtr client, virLXCControllerEventSendInit(ctrl, ctrl->initpid); ctrl->firstClient = false; - return dummy; + return ctrl; } @@ -1327,7 +1322,7 @@ virLXCControllerEventSendExit(virLXCControllerPtr ctrl, { virLXCProtocolExitEventMsg msg; - VIR_DEBUG("Exit status %d", exitstatus); + VIR_DEBUG("Exit status %d (client=%p)", exitstatus, ctrl->client); memset(&msg, 0, sizeof(msg)); switch (exitstatus) { case 0: -- 1.7.11.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list