]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix memory leak dispatching domain events
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 31 Aug 2011 15:50:09 +0000 (16:50 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 31 Aug 2011 16:51:09 +0000 (17:51 +0100)
When dispatching domain events we will create an XDR struct
containing the event info. Some of this data may be allocated
on the heap and so must be freed. The graphics event dispatcher
had a broken attempt to free one field, but missed others. All
the events have a dom->name string that needs freeing. The code
should have used the xdr_free() procedure for doing all this

* daemon/remote.c: Use xdr_free after dispatching events

daemon/remote.c

index 0f088c6172a356187815273ecd68ddb99eaaf794..34c63648dc570c4627df868afe182ecf93f49bca 100644 (file)
@@ -334,8 +334,6 @@ static int remoteRelayDomainEventGraphics(virConnectPtr conn ATTRIBUTE_UNUSED,
                                   REMOTE_PROC_DOMAIN_EVENT_GRAPHICS,
                                   (xdrproc_t)xdr_remote_domain_event_graphics_msg, &data);
 
-    VIR_FREE(data.subject.subject_val);
-
     return 0;
 }
 
@@ -2498,7 +2496,7 @@ remoteDispatchDomainEventSend(virNetServerClientPtr client,
     virNetMessagePtr msg;
 
     if (!(msg = virNetMessageNew()))
-        return;
+        goto cleanup;
 
     msg->header.prog = virNetServerProgramGetID(program);
     msg->header.vers = virNetServerProgramGetVersion(program);
@@ -2516,10 +2514,12 @@ remoteDispatchDomainEventSend(virNetServerClientPtr client,
     VIR_DEBUG("Queue event %d %zu", procnr, msg->bufferLength);
     virNetServerClientSendMessage(client, msg);
 
+    xdr_free(proc, data);
     return;
 
 cleanup:
     virNetMessageFree(msg);
+    xdr_free(proc, data);
 }
 
 static int