]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/commitdiff
pci_bridge_dev: fix error path in pci_bridge_dev_initfn()
authorJason Baron <jbaron@redhat.com>
Thu, 3 May 2012 02:42:15 +0000 (22:42 -0400)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Mon, 25 Jun 2012 13:55:19 +0000 (08:55 -0500)
Currently, we do not properly cleanup, if pci_bridge_dev_initfn
fails to initialize properly. Make sure to call pci_bridge_exitfn()
in the error path.

Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from commit 80aa796bf38b7ef21daa42673b4711510c450d8a)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
hw/pci_bridge_dev.c

index eccaa5831ee7739c5bc143ce2f579a3a23dfd368..ad63703c04b6da5c454c4f37377684c024d98627 100644 (file)
@@ -52,7 +52,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
 {
     PCIBridge *br = DO_UPCAST(PCIBridge, dev, dev);
     PCIBridgeDev *bridge_dev = DO_UPCAST(PCIBridgeDev, bridge, br);
-    int err;
+    int err, ret;
     pci_bridge_map_irq(br, NULL, pci_bridge_dev_map_irq_fn);
     err = pci_bridge_initfn(dev);
     if (err) {
@@ -86,6 +86,8 @@ slotid_error:
     shpc_cleanup(dev, &bridge_dev->bar);
 shpc_error:
     memory_region_destroy(&bridge_dev->bar);
+    ret = pci_bridge_exitfn(dev);
+    assert(!ret);
 bridge_error:
     return err;
 }