[libvirt] [PATCH] ESX: Fix memory leak in list handling functions.

Matthias Bolte matthias.bolte at googlemail.com
Wed Oct 28 20:12:57 UTC 2009


If an error occurs between the allocation of an item and appending it
to the list, the item leaks. Free such orphaned items in error cases.

* src/esx/esx_vi.c: free orphaned items in error cases
---
 src/esx/esx_vi.c |   24 ++++++++----------------
 1 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index bcf110f..04860e2 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -959,28 +959,22 @@ esxVI_List_CastFromAnyType(virConnectPtr conn, esxVI_AnyType *anyType,
 
         esxVI_AnyType_Free(&childAnyType);
 
-        if (esxVI_AnyType_Deserialize(conn, childNode, &childAnyType) < 0) {
+        if (esxVI_AnyType_Deserialize(conn, childNode, &childAnyType) < 0 ||
+            castFromAnyTypeFunc(conn, childAnyType, &item) < 0 ||
+            esxVI_List_Append(conn, list, item) < 0) {
             goto failure;
         }
 
         item = NULL;
-
-        if (castFromAnyTypeFunc(conn, childAnyType, &item) < 0) {
-            goto failure;
-        }
-
-        if (esxVI_List_Append(conn, list, item) < 0) {
-            goto failure;
-        }
     }
 
-
   cleanup:
     esxVI_AnyType_Free(&childAnyType);
 
     return result;
 
   failure:
+    freeFunc(&item);
     freeFunc(list);
 
     result = -1;
@@ -1039,20 +1033,18 @@ esxVI_List_Deserialize(virConnectPtr conn, xmlNodePtr node, esxVI_List **list,
             goto failure;
         }
 
-        item = NULL;
-
-        if (deserializeFunc(conn, node, &item) < 0) {
+        if (deserializeFunc(conn, node, &item) < 0 ||
+            esxVI_List_Append(conn, list, item) < 0) {
             goto failure;
         }
 
-        if (esxVI_List_Append(conn, list, item) < 0) {
-            goto failure;
-        }
+        item = NULL;
     }
 
     return 0;
 
   failure:
+    freeFunc(&item);
     freeFunc(list);
 
     return -1;
-- 
1.6.0.4




More information about the libvir-list mailing list