[PATCH 3/3] vbox: snapshot: Avoid memleaks in functions dealing with disk arrays

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In virVBoxSnapshotConfRemoveFakeDisks and
virVBoxSnapshotConfDiskIsInMediaRegistry the disk array constructed from
all the disks would be leaked at the end of the function and on
allocation errors. Also the temporary disk list would be leaked.

Add a cleanup section and free the memory properly.

Found by coverity.
---
 src/vbox/vbox_snapshot_conf.c | 54 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 10 deletions(-)

diff --git a/src/vbox/vbox_snapshot_conf.c b/src/vbox/vbox_snapshot_conf.c
index 69c7e42..49fd2b6 100644
--- a/src/vbox/vbox_snapshot_conf.c
+++ b/src/vbox/vbox_snapshot_conf.c
@@ -1471,28 +1471,45 @@ virVBoxSnapshotConfRemoveFakeDisks(virVBoxSnapshotConfMachinePtr machine)
     size_t diskSize = 0;
     virVBoxSnapshotConfHardDiskPtr *tempList = NULL;
     virVBoxSnapshotConfHardDiskPtr *diskList = NULL;
+
     if (VIR_ALLOC_N(diskList, 0) < 0)
-        return ret;
+        return -1;

     for (i = 0; i < machine->mediaRegistry->ndisks; i++) {
         tempSize = virVBoxSnapshotConfAllChildren(machine->mediaRegistry->disks[i], &tempList);
         if (VIR_EXPAND_N(diskList, diskSize, tempSize) < 0)
-            return ret;
-        for (j = 0; j < tempSize; j++) {
+            goto cleanup;
+
+        for (j = 0; j < tempSize; j++)
             diskList[diskSize - tempSize + j] = tempList[j];
-        }
+
+        VIR_FREE(tempList);
     }
+
     for (i = 0; i < diskSize; i++) {
         if (strstr(diskList[i]->location, "fake") != NULL) {
             if (virVBoxSnapshotConfRemoveHardDisk(machine->mediaRegistry, diskList[i]->uuid) < 0) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Unable to remove hard disk %s from media registry"),
                                diskList[i]->location);
-                return ret;
+                goto cleanup;
             }
         }
     }
+
     ret = 0;
+
+ cleanup:
+    for (i = 0; i < diskSize; i++)
+        virVboxSnapshotConfHardDiskFree(diskList[i]);
+    VIR_FREE(diskList);
+
+    if (tempList) {
+        for (i = 0; i < tempSize; i++)
+            virVboxSnapshotConfHardDiskFree(tempList[i]);
+        VIR_FREE(tempList);
+    }
+
     return ret;
 }

@@ -1513,24 +1530,41 @@ virVBoxSnapshotConfDiskIsInMediaRegistry(virVBoxSnapshotConfMachinePtr machine,
     size_t diskSize = 0;
     virVBoxSnapshotConfHardDiskPtr *tempList = NULL;
     virVBoxSnapshotConfHardDiskPtr *diskList = NULL;
+
     if (VIR_ALLOC_N(diskList, 0) < 0)
-        return ret;
+        return -1;

     for (i = 0; i < machine->mediaRegistry->ndisks; i++) {
         tempSize = virVBoxSnapshotConfAllChildren(machine->mediaRegistry->disks[i], &tempList);
         if (VIR_EXPAND_N(diskList, diskSize, tempSize) < 0)
-            return ret;
-        for (j = 0; j < tempSize; j++) {
+            goto cleanup;
+
+        for (j = 0; j < tempSize; j++)
             diskList[diskSize - tempSize + j] = tempList[j];
-        }
+
+        VIR_FREE(tempList);
     }
+
     for (i = 0; i < diskSize; i++) {
         if (STREQ(diskList[i]->location, location)) {
             ret = 1;
-            return ret;
+            goto cleanup;
         }
     }
+
     ret = 0;
+
+ cleanup:
+    for (i = 0; i < diskSize; i++)
+        virVboxSnapshotConfHardDiskFree(diskList[i]);
+    VIR_FREE(diskList);
+
+    if (tempList) {
+        for (i = 0; i < tempSize; i++)
+            virVboxSnapshotConfHardDiskFree(tempList[i]);
+        VIR_FREE(tempList);
+    }
+
     return ret;
 }

-- 
1.9.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]