[libvirt] [PATCH] qemu: avoid memory leaks

Eric Blake eblake at redhat.com
Tue Aug 2 21:46:02 UTC 2011


On 08/02/2011 02:48 PM, Laine Stump wrote:
> On 08/02/2011 04:10 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.
>>
>>
>> - if (qemuParseCommandLineChr(chr, val)< 0)
>> + if (qemuParseCommandLineChr(chr, val)< 0) {
>> + VIR_FREE(chr);
>
>
> Shouldn't this be virDomainChrDefFree(chr)?
>
>

>> virDomainDiskDefPtr first_rbd_disk = NULL;
>> for (i = 0 ; i< def->ndisks ; i++) {
>> - virDomainDiskDefPtr disk = def->disks[i];
>> + disk = def->disks[i];
>> if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK&&
>> disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) {
>> first_rbd_disk = disk;
>> + disk = NULL;
>> break;
>> }
>
>
> If you never hit the if condition, disk will be left pointing to one of
> the disks in def, and will be freed during cleanup. I think you want to
> set disk = NULL after this look is finished as well, don't you? (Either
> that, or just use a different variable).

Both good points.  I'm squashing this in to create v2.

diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c
index c638420..194f3ff 100644
--- i/src/qemu/qemu_command.c
+++ w/src/qemu/qemu_command.c
@@ -6522,7 +6522,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
                      goto no_memory;

                  if (qemuParseCommandLineChr(chr, val) < 0) {
-                    VIR_FREE(chr);
+                    virDomainChrSourceDefFree(chr);
                      goto error;
                  }

@@ -6552,11 +6552,9 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
              char *hosts, *port, *saveptr = NULL, *token;
              virDomainDiskDefPtr first_rbd_disk = NULL;
              for (i = 0 ; i < def->ndisks ; i++) {
-                disk = def->disks[i];
-                if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
-                    disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) {
-                    first_rbd_disk = disk;
-                    disk = NULL;
+                if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
+                    def->disks[i]->protocol == 
VIR_DOMAIN_DISK_PROTOCOL_RBD) {
+                    first_rbd_disk = def->disks[i];
                      break;
                  }
              }


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




More information about the libvir-list mailing list