[libvirt] [PATCH 4/4] pci: avoid memory leak on error
Wen Congyang
wency at cn.fujitsu.com
Fri Jul 1 01:13:43 UTC 2011
At 07/01/2011 07:36 AM, Eric Blake Write:
> Detected by Coverity. Some, but not all, error paths were clean;
> but they were repetitive so I refactored them.
>
> * src/util/pci.c (pciGetDevice): Plug leak.
> ---
> src/util/pci.c | 31 +++++++++++++++----------------
> 1 files changed, 15 insertions(+), 16 deletions(-)
>
> diff --git a/src/util/pci.c b/src/util/pci.c
> index 46a3a83..21c12b9 100644
> --- a/src/util/pci.c
> +++ b/src/util/pci.c
> @@ -1294,7 +1294,8 @@ pciGetDevice(unsigned domain,
> unsigned function)
> {
> pciDevice *dev;
> - char *vendor, *product;
> + char *vendor = NULL;
> + char *product = NULL;
>
> if (VIR_ALLOC(dev) < 0) {
> virReportOOMError();
> @@ -1313,22 +1314,19 @@ pciGetDevice(unsigned domain,
> pciReportError(VIR_ERR_INTERNAL_ERROR,
> _("dev->name buffer overflow: %.4x:%.2x:%.2x.%.1x"),
> dev->domain, dev->bus, dev->slot, dev->function);
> - pciFreeDevice(dev);
> - return NULL;
> + goto error;
> }
> if (virAsprintf(&dev->path, PCI_SYSFS "devices/%s/config",
> dev->name) < 0) {
> virReportOOMError();
> - pciFreeDevice(dev);
> - return NULL;
> + goto error;
> }
>
> if (access(dev->path, F_OK) != 0) {
> virReportSystemError(errno,
> _("Device %s not found: could not access %s"),
> dev->name, dev->path);
> - pciFreeDevice(dev);
> - return NULL;
> + goto error;
> }
>
> vendor = pciReadDeviceID(dev, "vendor");
> @@ -1338,10 +1336,7 @@ pciGetDevice(unsigned domain,
> pciReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to read product/vendor ID for %s"),
> dev->name);
> - VIR_FREE(product);
> - VIR_FREE(vendor);
> - pciFreeDevice(dev);
> - return NULL;
> + goto error;
> }
>
> /* strings contain '0x' prefix */
> @@ -1350,16 +1345,20 @@ pciGetDevice(unsigned domain,
> pciReportError(VIR_ERR_INTERNAL_ERROR,
> _("dev->id buffer overflow: %s %s"),
> &vendor[2], &product[2]);
> - pciFreeDevice(dev);
> - return NULL;
> + goto error;
> }
>
> - VIR_FREE(product);
> - VIR_FREE(vendor);
> -
> VIR_DEBUG("%s %s: initialized", dev->id, dev->name);
>
> +cleanup:
> + VIR_FREE(product);
> + VIR_FREE(vendor);
> return dev;
> +
> +error:
> + pciFreeDevice(dev);
> + dev = NULL;
> + goto cleanup;
> }
>
> void
ACK
More information about the libvir-list
mailing list