[libvirt] [PATCH] virscsi: Introduce virSCSIDeviceUsedByInfoFree
Osier Yang
jyang at redhat.com
Fri Mar 7 15:39:38 UTC 2014
On 07/03/14 22:55, John Ferlan wrote:
> This resolves a Coverity RESOURCE_LEAK issue introduced by commit
> id 'de6fa535' where the virSCSIDeviceSetUsedBy() didn't VIR_FREE
> the 'copy' or possibly VIR_STRDUP()'d values.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/util/virscsi.c | 26 +++++++++++++++-----------
> 1 file changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/src/util/virscsi.c b/src/util/virscsi.c
> index 69eae24..66e3161 100644
> --- a/src/util/virscsi.c
> +++ b/src/util/virscsi.c
> @@ -268,6 +268,14 @@ cleanup:
> return ret;
> }
>
> +static void
> +virSCSIDeviceUsedByInfoFree(virUsedByInfoPtr used_by)
> +{
> + VIR_FREE(used_by->drvname);
> + VIR_FREE(used_by->domname);
> + VIR_FREE(used_by);
> +}
> +
> void
> virSCSIDeviceFree(virSCSIDevicePtr dev)
> {
> @@ -279,11 +287,8 @@ virSCSIDeviceFree(virSCSIDevicePtr dev)
> VIR_FREE(dev->id);
> VIR_FREE(dev->name);
> VIR_FREE(dev->sg_path);
> - for (i = 0; i < dev->n_used_by; i++) {
> - VIR_FREE(dev->used_by[i]->drvname);
> - VIR_FREE(dev->used_by[i]->domname);
> - VIR_FREE(dev->used_by[i]);
> - }
> + for (i = 0; i < dev->n_used_by; i++)
> + virSCSIDeviceUsedByInfoFree(dev->used_by[i]);
> VIR_FREE(dev->used_by);
> VIR_FREE(dev);
> }
> @@ -296,10 +301,11 @@ virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev,
> virUsedByInfoPtr copy;
> if (VIR_ALLOC(copy) < 0)
> return -1;
> - if (VIR_STRDUP(copy->drvname, drvname) < 0)
> - return -1;
> - if (VIR_STRDUP(copy->domname, domname) < 0)
> + if (VIR_STRDUP(copy->drvname, drvname) < 0 ||
> + VIR_STRDUP(copy->domname, domname) < 0) {
> + virSCSIDeviceUsedByInfoFree(copy);
> return -1;
> + }
>
> return VIR_APPEND_ELEMENT(dev->used_by, dev->n_used_by, copy);
> }
> @@ -449,9 +455,7 @@ virSCSIDeviceListDel(virSCSIDeviceListPtr list,
> if (STREQ_NULLABLE(dev->used_by[i]->drvname, drvname) &&
> STREQ_NULLABLE(dev->used_by[i]->domname, domname)) {
> if (dev->n_used_by > 1) {
> - VIR_FREE(dev->used_by[i]->drvname);
> - VIR_FREE(dev->used_by[i]->domname);
> - VIR_FREE(dev->used_by[i]);
> + virSCSIDeviceUsedByInfoFree(dev->used_by[i]);
> VIR_DELETE_ELEMENT(dev->used_by, i, dev->n_used_by);
> } else {
> tmp = virSCSIDeviceListSteal(list, dev);
ACK
More information about the libvir-list
mailing list