Fix a potential race in pciInitDevice.

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@redhat.com>
This commit is contained in:
Chris Lalancette 2010-07-28 14:07:08 -04:00
parent 82b6d7600e
commit 56b408231a
2 changed files with 5 additions and 5 deletions

View File

@ -8018,7 +8018,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) {

View File

@ -188,8 +188,10 @@ pciCloseConfig(pciDevice *dev)
if (!dev)
return;
if (dev->fd >= 0)
if (dev->fd >= 0) {
close(dev->fd);
dev->fd = -1;
}
}
static int
@ -672,10 +674,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;