[libvirt] [PATCH 03/11] storage: Resolve resource leaks with cmd processing

Osier Yang jyang at redhat.com
Thu Jan 31 10:51:55 UTC 2013


On 2013年01月31日 03:36, John Ferlan wrote:
> ---
>   src/storage/storage_backend_disk.c | 28 +++++++++++++++-------------
>   1 file changed, 15 insertions(+), 13 deletions(-)
>
> diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
> index 4214e97..40da306 100644
> --- a/src/storage/storage_backend_disk.c
> +++ b/src/storage/storage_backend_disk.c
> @@ -1,7 +1,7 @@
>   /*
>    * storage_backend_disk.c: storage backend for disk handling
>    *
> - * Copyright (C) 2007-2008, 2010-2012 Red Hat, Inc.
> + * Copyright (C) 2007-2008, 2010-2013 Red Hat, Inc.
>    * Copyright (C) 2007-2008 Daniel P. Berrange
>    *
>    * This library is free software; you can redistribute it and/or
> @@ -385,14 +385,7 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>   {
>       bool ok_to_mklabel = false;
>       int ret = -1;
> -    /* eg parted /dev/sda mklabel msdos */
> -    virCommandPtr cmd = virCommandNewArgList(PARTED,
> -                                             pool->def->source.devices[0].path,
> -                                             "mklabel",
> -                                             "--script",
> -                                             ((pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) ? "msdos" :
> -                                              virStoragePoolFormatDiskTypeToString(pool->def->source.format)),
> -                                             NULL);
> +    virCommandPtr cmd = NULL;
>
>       virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
>                     VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
> @@ -423,8 +416,17 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>           }
>       }
>
> -    if (ok_to_mklabel)
> +    if (ok_to_mklabel) {
> +        /* eg parted /dev/sda mklabel msdos */
> +        cmd = virCommandNewArgList(PARTED,
> +                                   pool->def->source.devices[0].path,
> +                                   "mklabel",
> +                                   "--script",
> +                                   ((pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) ? "msdos" :
> +                                   virStoragePoolFormatDiskTypeToString(pool->def->source.format)),
> +                                   NULL);
>           ret = virCommandRun(cmd, NULL);
> +    }

Good catch.

>
>   error:
>       virCommandFree(cmd);
> @@ -634,7 +636,7 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
>                                  virStorageVolDefPtr vol)
>   {
>       int res = -1;
> -    char *partFormat;
> +    char *partFormat = NULL;
>       unsigned long long startOffset = 0, endOffset = 0;
>       virCommandPtr cmd = virCommandNewArgList(PARTED,
>                                                pool->def->source.devices[0].path,
> @@ -646,11 +648,11 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
>           virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                          "%s", _("storage pool does not support encrypted "
>                                  "volumes"));
> -        return -1;
> +        goto cleanup;
>       }
>
>       if (virStorageBackendDiskPartFormat(pool, vol,&partFormat) != 0) {
> -        return -1;
> +        goto cleanup;
>       }
>       virCommandAddArg(cmd, partFormat);
>

ACK




More information about the libvir-list mailing list