[libvirt] [PATCH] Fix a potential race in pciInitDevice.

Don Dutile ddutile at redhat.com
Wed Jul 28 22:17:31 UTC 2010


Chris Lalancette wrote:
> If detecting the FLR flag of a pci device fails, then we
> could run into the situation of trying to close a file
> descriptor twice, once in pciInitDevice() and once in pciFreeDevice().
> Fix that by removing the pciCloseConfig() in pciInitDevice() and
> just letting pciFreeDevice() handle it.
> 
> Thanks to Chris Wright for pointing out this problem.
> 
> While we are at it, fix an error check.  While it would actually
> work as-is (since success returns 0), it's still more clear to
> check for < 0 (as the rest of the code does).
> 
> Signed-off-by: Chris Lalancette <clalance at redhat.com>
> ---
>  src/qemu/qemu_driver.c |    2 +-
>  src/util/pci.c         |    8 ++++----
>  2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index b4c468a..9436e2a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -8010,7 +8010,7 @@ static int qemudDomainAttachHostPciDevice(struct qemud_driver *driver,
>          return -1;
>      }
>  
> -    if (qemuPrepareHostdevPCIDevices(driver, &hostdev, 1))
> +    if (qemuPrepareHostdevPCIDevices(driver, &hostdev, 1) < 0)
>          return -1;
>  
>      if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> diff --git a/src/util/pci.c b/src/util/pci.c
> index 14ef058..26d55b8 100644
> --- a/src/util/pci.c
> +++ b/src/util/pci.c
> @@ -189,8 +189,10 @@ pciCloseConfig(pciDevice *dev)
>      if (!dev)
>          return;
>  
> -    if (dev->fd >= 0)
> +    if (dev->fd >= 0) {
>          close(dev->fd);
> +        dev->fd = -1;
> +    }
>  }
>  
>  static int
> @@ -673,10 +675,8 @@ pciInitDevice(pciDevice *dev)
>      dev->pcie_cap_pos   = pciFindCapabilityOffset(dev, PCI_CAP_ID_EXP);
>      dev->pci_pm_cap_pos = pciFindCapabilityOffset(dev, PCI_CAP_ID_PM);
>      flr = pciDetectFunctionLevelReset(dev);
> -    if (flr < 0) {
> -        pciCloseConfig(dev);
> +    if (flr < 0)
>          return flr;
> -    }
>      dev->has_flr        = flr;
>      dev->has_pm_reset   = pciDetectPowerManagementReset(dev);
>      dev->initted        = 1;

seems simple & logical enough...

Acked-by: Donald Dutile <ddutile at redhat.com>




More information about the libvir-list mailing list