[libvirt] [PATCH 7/n] qemu: plug memory leak

Eric Blake eblake at redhat.com
Tue Nov 30 19:06:13 UTC 2010


* src/qemu/qemu_driver.c (qemudShutdown): Free all strings and the
ebtables structure.
* src/libvirt_private.syms (ebtablesContextFree): Export missing
symbol.
* src/util/ebtables.c (ebtablesContextFree): Allow early exit.
---

This leak triggers on every start/stop of a qemu domain, although
it typically accounts for less than 1k leak per sequence.

 src/libvirt_private.syms |    1 +
 src/qemu/qemu_driver.c   |   13 ++++++++++---
 src/util/ebtables.c      |    2 ++
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ef33f86..43df955 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -325,6 +325,7 @@ virDomainConfVMNWFilterTeardown;
 # ebtables.h
 ebtablesAddForwardAllowIn;
 ebtablesAddForwardPolicyReject;
+ebtablesContextFree;
 ebtablesContextNew;
 ebtablesRemoveForwardAllowIn;

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f00d8a3..faab42a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2068,10 +2068,9 @@ qemudShutdown(void) {

     virSysinfoDefFree(qemu_driver->hostsysinfo);

-    VIR_FREE(qemu_driver->securityDriverName);
-    VIR_FREE(qemu_driver->logDir);
     VIR_FREE(qemu_driver->configDir);
     VIR_FREE(qemu_driver->autostartDir);
+    VIR_FREE(qemu_driver->logDir);
     VIR_FREE(qemu_driver->stateDir);
     VIR_FREE(qemu_driver->libDir);
     VIR_FREE(qemu_driver->cacheDir);
@@ -2081,10 +2080,18 @@ qemudShutdown(void) {
     VIR_FREE(qemu_driver->vncListen);
     VIR_FREE(qemu_driver->vncPassword);
     VIR_FREE(qemu_driver->vncSASLdir);
-    VIR_FREE(qemu_driver->saveImageFormat);
+    VIR_FREE(qemu_driver->spiceTLSx509certdir);
+    VIR_FREE(qemu_driver->spiceListen);
+    VIR_FREE(qemu_driver->spicePassword);
     VIR_FREE(qemu_driver->hugetlbfs_mount);
     VIR_FREE(qemu_driver->hugepage_path);

+    VIR_FREE(qemu_driver->securityDriverName);
+    VIR_FREE(qemu_driver->saveImageFormat);
+    VIR_FREE(qemu_driver->dumpImageFormat);
+
+    ebtablesContextFree(qemu_driver->ebtables);
+
     if (qemu_driver->cgroupDeviceACL) {
         for (i = 0 ; qemu_driver->cgroupDeviceACL[i] != NULL ; i++)
             VIR_FREE(qemu_driver->cgroupDeviceACL[i]);
diff --git a/src/util/ebtables.c b/src/util/ebtables.c
index f707756..e3b8da4 100644
--- a/src/util/ebtables.c
+++ b/src/util/ebtables.c
@@ -300,6 +300,8 @@ ebtablesContextNew(const char *driver)
 void
 ebtablesContextFree(ebtablesContext *ctx)
 {
+    if (!ctx)
+        return;
     if (ctx->input_filter)
         ebtRulesFree(ctx->input_filter);
     if (ctx->forward_filter)
-- 
1.7.3.2




More information about the libvir-list mailing list