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

Yohan Belleguic yohan.belleguic at diateam.net
Tue Jun 17 09:53:49 UTC 2014


Le Tuesday 17 June 2014 11:24:09, Peter Krempa a écrit :
> 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);
> +    }
Same comments than the previous patch
> +
>      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);
> +    }
Same comments than the previous patch
> +
>      return ret;
>  }

-- 
Yohan BELLEGUIC
Software Engineer - diateam : Architectes de l'information
Phone : +33 (0)2 98 050 050 Fax : +33 (0)2 98 050 05




More information about the libvir-list mailing list