Fix a crash when restarting libvirtd.

If you shutdown libvirtd while a domain with PCI
devices is running, then try to restart libvirtd,
libvirtd will crash.

This happens because qemuUpdateActivePciHostdevs() is calling
pciDeviceListSteal() with a dev of 0x0 (NULL), and then trying
to dereference it.  This patch fixes it up so that
qemuUpdateActivePciHostdevs() steals the devices after first
Get()'ting them, avoiding the crash.

Signed-off-by: Chris Lalancette <clalance@redhat.com>
This commit is contained in:
Chris Lalancette 2010-01-25 11:13:41 -05:00
parent a7d17c6187
commit 7cc5410bfd

View File

@ -2147,6 +2147,7 @@ qemuUpdateActivePciHostdevs(struct qemud_driver *driver,
virDomainDefPtr def)
{
pciDeviceList *pcidevs;
int i;
int ret = -1;
if (!def->nhostdevs)
@ -2155,8 +2156,9 @@ qemuUpdateActivePciHostdevs(struct qemud_driver *driver,
if (!(pcidevs = qemuGetPciHostDeviceList(NULL, def)))
return -1;
while (pciDeviceListCount(pcidevs) > 0) {
pciDevice *dev = pciDeviceListSteal(NULL, pcidevs, 0);
for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
pciDevice *dev = pciDeviceListGet(pcidevs, i);
pciDeviceListSteal(NULL, pcidevs, dev);
if (pciDeviceListAdd(NULL,
driver->activePciHostdevs,
dev) < 0) {