From a91d3115b5c460af8a6f70d2092d0bc5ef9b723e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 31 Aug 2011 16:50:09 +0100 Subject: [PATCH] Fix memory leak dispatching domain events 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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 0f088c6172..34c63648dc 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -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