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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list