From: Matthias Bolte Date: Thu, 22 Oct 2009 07:47:51 +0000 (+0200) Subject: ESX: Fix memory leak in list handling functions. X-Git-Tag: v0.7.3~147 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=680c92ae7e8ebdc011f1bdf21abb4f722e3c4ae5;p=thirdparty%2Flibvirt.git ESX: Fix memory leak in list handling functions. 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 --- diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index bcf110fe8c..04860e2068 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;