From: "Daniel P. Berrange" <berrange(a)redhat.com>
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(a)redhat.com>
---
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