From: Chris Lalancette Date: Mon, 25 Jan 2010 16:13:41 +0000 (-0500) Subject: Fix a crash when restarting libvirtd. X-Git-Tag: v0.7.6~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cc5410bfd78f67300fe0344658e66df6482aa25;p=thirdparty%2Flibvirt.git 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 --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 16e9b565b5..adf962a842 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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) {