From: John Ferlan Date: Thu, 6 Feb 2014 17:30:57 +0000 (-0500) Subject: virpci: Resolve coverity issues X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=b60644f38fe4d754c0f738f42bf9dbec294e8235;p=libvirt.git virpci: Resolve coverity issues Coverity complains about "USE_AFTER_FREE" due to how virPCIDeviceSetStubDriver "could" return either -1, 0, or 1 from the VIR_STRDUP() and then possibly makes a call to virPCIDeviceDetach(). The only way this could happen is if NULL were passed as the "driver" name and virStrdup() returned 0. Since the calling functions check < 0 on the initial function call, the 0 possibility causes Coverity to complain. To fix this - enforce that the second parameter is not NULL using ATTRIBUTE_NONNULL(2) for the function prototype, then in virPCIDeviceDetach add an sa_assert(dev->stubDriver). This will result in Coverity not complaining any more. --- diff --git a/src/util/virpci.c b/src/util/virpci.c index c3d211f64b..00d106441b 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -1327,6 +1327,8 @@ virPCIDeviceDetach(virPCIDevicePtr dev, virPCIDeviceList *activeDevs, virPCIDeviceList *inactiveDevs) { + sa_assert(dev->stubDriver); + if (virPCIProbeStubDriver(dev->stubDriver) < 0) return -1; @@ -1657,7 +1659,7 @@ int virPCIDeviceSetStubDriver(virPCIDevicePtr dev, const char *driver) { VIR_FREE(dev->stubDriver); - return driver ? VIR_STRDUP(dev->stubDriver, driver) : 0; + return VIR_STRDUP(dev->stubDriver, driver); } const char * diff --git a/src/util/virpci.h b/src/util/virpci.h index 42c3c957e2..ac6dae18e0 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -63,7 +63,8 @@ void virPCIDeviceSetManaged(virPCIDevice *dev, bool managed); unsigned int virPCIDeviceGetManaged(virPCIDevice *dev); int virPCIDeviceSetStubDriver(virPCIDevicePtr dev, - const char *driver); + const char *driver) + ATTRIBUTE_NONNULL(2); const char *virPCIDeviceGetStubDriver(virPCIDevicePtr dev); void virPCIDeviceSetUsedBy(virPCIDevice *dev, const char *used_by);