[libvirt] [PATCHv2 9/3] qemu: avoid memory leaks

Eric Blake eblake at redhat.com
Tue Aug 2 22:33:41 UTC 2011


On 08/02/2011 03:50 PM, Eric Blake wrote:
> On 08/02/2011 03:46 PM, Eric Blake wrote:
>> Quite a few leaks detected by coverity. For chr, the leaks were
>> close enough to the allocations to plug in place; for disk, the
>> leaks were separated from the allocation by enough other lines with
>> intermediate failure cases that I refactored the cleanup instead.
>>
>> * src/qemu/qemu_command.c (qemuParseCommandLine): Plug leaks.
>> ---
>>
>> v2: address review comments from v1
>
> squash this in too (serves me right for hitting send prior to 'make
> check' completing).

Yet more to squash in.

diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c
index 067e53e..76df0aa 100644
--- i/src/qemu/qemu_command.c
+++ w/src/qemu/qemu_command.c
@@ -6226,18 +6226,14 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr 
caps,
              }

              if (!(disk->src || disk->nhosts > 0) ||
-                !disk->dst) {
-                virDomainDiskDefFree(disk);
+                !disk->dst)
                  goto no_memory;
-            }

              if (virDomainDiskDefAssignAddress(caps, disk) < 0)
                  goto error;

-            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) {
-                virDomainDiskDefFree(disk);
+            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
                  goto no_memory;
-            }
              def->disks[def->ndisks++] = disk;
              disk = NULL;
          } else if (STREQ(arg, "-no-acpi")) {
@@ -6361,24 +6357,17 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr 
caps,
                  if (VIR_ALLOC(disk) < 0)
                      goto no_memory;
                  disk->src = strdup(val + strlen("disk:"));
-                if (!disk->src) {
-                    virDomainDiskDefFree(disk);
+                if (!disk->src)
                      goto no_memory;
-                }
                  if (STRPREFIX(disk->src, "/dev/"))
                      disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
                  else
                      disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
                  disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
                  disk->bus = VIR_DOMAIN_DISK_BUS_USB;
-                if (!(disk->dst = strdup("sda"))) {
-                    virDomainDiskDefFree(disk);
+                if (!(disk->dst = strdup("sda")) ||
+                    VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
                      goto no_memory;
-                }
-                if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) {
-                    virDomainDiskDefFree(disk);
-                    goto no_memory;
-                }
                  def->disks[def->ndisks++] = disk;
                  disk = NULL;
              } else {
@@ -6407,10 +6396,8 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
              WANT_VALUE();
              if (!(disk = qemuParseCommandLineDisk(caps, val, 
nvirtiodisk)))
                  goto error;
-            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) {
-                virDomainDiskDefFree(disk);
+            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
                  goto no_memory;
-            }
              if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO)
                  nvirtiodisk++;

@@ -6682,7 +6669,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
  no_memory:
      virReportOOMError();
  error:
-    VIR_FREE(disk);
+    virDomainDiskDefFree(disk);
      VIR_FREE(cmd);
      virDomainDefFree(def);
      VIR_FREE(nics);


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list