]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix potential crash in libvirtd with active streams
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 8 Jul 2011 11:33:52 +0000 (12:33 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 8 Jul 2011 15:19:57 +0000 (16:19 +0100)
If a client disconnects while it has a stream active, there is
a race condition which could see libvirtd crash. This is because
the client struct may be freed before the last stream event has
triggered. This is trivially solved by holding an extra reference
on the client for the stream callbak

* daemon/stream.c: Acquire reference on client when adding the
  stream callback

daemon/stream.c

index 56d79c2b6cbd7cf19b2b1bd9e4c0565e7a7c05a8..28f6c326d7b35c718974647f4d865764e75ef0ae 100644 (file)
@@ -104,6 +104,15 @@ daemonStreamMessageFinished(virNetMessagePtr msg,
     daemonStreamUpdateEvents(stream);
 }
 
+
+static void
+daemonStreamEventFreeFunc(void *opaque)
+{
+    virNetServerClientPtr client = opaque;
+
+    virNetServerClientFree(client);
+}
+
 /*
  * Callback that gets invoked when a stream becomes writable/readable
  */
@@ -361,9 +370,11 @@ int daemonAddClientStream(virNetServerClientPtr client,
     }
 
     if (virStreamEventAddCallback(stream->st, 0,
-                                  daemonStreamEvent, client, NULL) < 0)
+                                  daemonStreamEvent, client,
+                                  daemonStreamEventFreeFunc) < 0)
         return -1;
 
+    virNetServerClientRef(client);
     if ((stream->filterID = virNetServerClientAddFilter(client,
                                                         daemonStreamFilter,
                                                         stream)) < 0) {