
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@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org