[libvirt] [PATCH] esx: Fix memory leak when looking up an non-existing domain by name

Matthias Bolte matthias.bolte at googlemail.com
Sun Aug 8 20:56:56 UTC 2010


In case an optional object cannot be found the lookup function is
left early and the cleanup code is not executed. Add a success label
and goto instead of an early return.

This pattern occurs in some other functions too.
---
 src/esx/esx_vi.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index c6b2b63..b064b11 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -2254,7 +2254,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid,
 
     if (managedObjectReference == NULL) {
         if (occurrence == esxVI_Occurrence_OptionalItem) {
-            return 0;
+            goto success;
         } else {
             ESX_VI_ERROR(VIR_ERR_NO_DOMAIN,
                          _("Could not find domain with UUID '%s'"),
@@ -2270,6 +2270,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid,
         goto cleanup;
     }
 
+  success:
     result = 0;
 
   cleanup:
@@ -2327,7 +2328,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name,
 
     if (*virtualMachine == NULL) {
         if (occurrence == esxVI_Occurrence_OptionalItem) {
-            return 0;
+            goto success;
         } else {
             ESX_VI_ERROR(VIR_ERR_NO_DOMAIN,
                          _("Could not find domain with name '%s'"), name);
@@ -2335,6 +2336,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name,
         }
     }
 
+  success:
     result = 0;
 
   cleanup:
@@ -2890,7 +2892,7 @@ esxVI_LookupCurrentSnapshotTree
 
     if (currentSnapshot == NULL) {
         if (occurrence == esxVI_Occurrence_OptionalItem) {
-            return 0;
+            goto success;
         } else {
             ESX_VI_ERROR(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s",
                          _("Domain has no current snapshot"));
@@ -2911,6 +2913,7 @@ esxVI_LookupCurrentSnapshotTree
         goto cleanup;
     }
 
+  success:
     result = 0;
 
   cleanup:
@@ -3050,9 +3053,7 @@ esxVI_LookupFileInfoByDatastorePath(esxVI_Context *ctx,
     /* Interpret search result */
     if (searchResults->file == NULL) {
         if (occurrence == esxVI_Occurrence_OptionalItem) {
-            result = 0;
-
-            goto cleanup;
+            goto success;
         } else {
             ESX_VI_ERROR(VIR_ERR_NO_STORAGE_VOL,
                          _("No storage volume with key or path '%s'"),
@@ -3064,6 +3065,7 @@ esxVI_LookupFileInfoByDatastorePath(esxVI_Context *ctx,
     *fileInfo = searchResults->file;
     searchResults->file = NULL;
 
+  success:
     result = 0;
 
   cleanup:
-- 
1.7.0.4




More information about the libvir-list mailing list