[Libvirt-cim] [PATCH] Fix memory leaks in RASD, RAFP, and DevicePool

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Fri Nov 6 23:14:32 UTC 2009


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1257545021 28800
# Node ID 280a12d7c513129ebf86ac271aac5474161d3aae
# Parent  910c18bbb6264c90294375e94882e600f3dd8237
Fix memory leaks in RASD, RAFP, and DevicePool

Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>

diff -r 910c18bbb626 -r 280a12d7c513 src/Virt_DevicePool.c
--- a/src/Virt_DevicePool.c	Thu Nov 05 14:20:54 2009 -0800
+++ b/src/Virt_DevicePool.c	Fri Nov 06 14:03:41 2009 -0800
@@ -102,11 +102,14 @@
                 return 0;
 
         *pool = malloc(sizeof(**pool));
-        if (*pool == NULL)
-                return 0;
+        if (*pool == NULL) {
+                ret = 0;
+                goto out;
+        }
 
         ret = get_pool_from_xml(xml, *pool, CIM_RES_TYPE_DISK);
 
+ out:
         free(xml);
 
         return ret;
@@ -130,30 +133,31 @@
                 goto out;
         }
 
+        if (virConnectListStoragePools(conn, names, count) == -1) {
+                CU_DEBUG("Failed to get storage pools");
+                goto out;
+        }
+
         pools = calloc(count, sizeof(*pools));
         if (pools == NULL) {
                 CU_DEBUG("Failed to alloc space for %i pool structs", count);
                 goto out;
         }
 
-        if (virConnectListStoragePools(conn, names, count) == -1) {
-                CU_DEBUG("Failed to get storage pools");
-                free(pools);
-                goto out;
-        }
-
         for (i = 0; i < count; i++) {
                 pools[i].tag = names[i];
                 pools[i].primordial = false;
         }
 
  out:
+        for (i = 0; i < count; i++)
+                free(names[i]);
+        free(names);
+
         get_disk_parent(&pools, &count);
 
         *_pools = pools;
 
-        free(names);
-
         return count;
 }
 
@@ -464,6 +468,8 @@
                 free(_bridge);
         }
 
+        for (i = 0; i < num; i++)
+                free(networks[i]);
         free(networks);
 
         return network;
@@ -870,12 +876,12 @@
         }
 
         set_params(inst, CIM_RES_TYPE_NET, id, NULL, cap, false);
-        free(id);
         free(cap);
-        free(bridge);
 
         inst_list_add(list, inst);
  out:
+        free(bridge);
+        free(id);
         virNetworkFree(network);
 
         return s;
@@ -890,7 +896,7 @@
         CMPIStatus s = {CMPI_RC_OK, NULL};
         char **netnames = NULL;
         int i;
-        int nets;
+        int nets = 0;
 
         if (id != NULL) {
                 return _netpool_for_network(list,
@@ -942,6 +948,8 @@
         }
 
  out:
+        for (i = 0; i < nets; i++)
+                free(netnames[i]);
         free(netnames);
 
         return s;
@@ -1350,8 +1358,6 @@
                         break;
                 }
 
-                inst_list_free(&list);
-
                 if (inst == NULL) {
                         cu_statusf(broker, s,
                                    CMPI_RC_ERR_FAILED,
@@ -1362,6 +1368,7 @@
         }
 
  out:
+        inst_list_free(&list);
 
         return inst;
 }
diff -r 910c18bbb626 -r 280a12d7c513 src/Virt_RASD.c
--- a/src/Virt_RASD.c	Thu Nov 05 14:20:54 2009 -0800
+++ b/src/Virt_RASD.c	Fri Nov 06 14:03:41 2009 -0800
@@ -407,6 +407,8 @@
                                   CLASSNAME(ref),
                                   base,
                                   NAMESPACE(ref));
+        free(base);
+
         if (inst == NULL)
                 return inst;
 
@@ -523,6 +525,8 @@
         else
                 *_inst = inst;
         
+        cleanup_virt_device(dev);
+
  out:
         virConnectClose(conn);
         free(host);
@@ -696,6 +700,10 @@
                 cu_statusf(broker, &s,
                            CMPI_RC_ERR_FAILED,
                            "Failed to get domain name");
+
+                for (i = 0; i < count; i++)
+                        cleanup_virt_device(&devs[i]);
+
                 goto out;
         }
 
diff -r 910c18bbb626 -r 280a12d7c513 src/Virt_ResourceAllocationFromPool.c
--- a/src/Virt_ResourceAllocationFromPool.c	Thu Nov 05 14:20:54 2009 -0800
+++ b/src/Virt_ResourceAllocationFromPool.c	Fri Nov 06 14:03:41 2009 -0800
@@ -120,6 +120,8 @@
                         inst_list_add(dest, inst);
         }
 
+        free(poolid);
+
         return dest->cur;
 }
 




More information about the Libvirt-cim mailing list