aboutsummaryrefslogtreecommitdiff
path: root/hw/pci
diff options
context:
space:
mode:
authorBernhard Beschow <shentey@gmail.com>2023-04-03 09:41:19 +0200
committerAnthony PERARD <anthony.perard@citrix.com>2023-06-07 15:07:10 +0100
commitc0b59416c05fbf7a5fefee4b4757f7281e34ed02 (patch)
tree5618ad754c0d0986b70166b673730d38a1bd8ea9 /hw/pci
parent27047bd26633d559b9630c57e922e4e78cb2ff1d (diff)
downloadqemu-c0b59416c05fbf7a5fefee4b4757f7281e34ed02.zip
qemu-c0b59416c05fbf7a5fefee4b4757f7281e34ed02.tar.gz
qemu-c0b59416c05fbf7a5fefee4b4757f7281e34ed02.tar.bz2
hw/pci/pci.c: Don't leak PCIBus::irq_count[] in pci_bus_irqs()
When calling pci_bus_irqs() multiple times on the same object without calling pci_bus_irqs_cleanup() in between PCIBus::irq_count[] is currently leaked. Let's fix this because Xen will do just that in a few commits, and because calling pci_bus_irqs_cleanup() in between seems fragile and cumbersome. Note that pci_bus_irqs_cleanup() now has to NULL irq_count such that pci_bus_irqs() doesn't do a double free. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Chuck Zmudzinski <brchuckz@aol.com> Message-Id: <20230403074124.3925-3-shentey@gmail.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Diffstat (limited to 'hw/pci')
-rw-r--r--hw/pci/pci.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 1cc7c89..9b7b4d7 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -560,6 +560,7 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq,
bus->set_irq = set_irq;
bus->irq_opaque = irq_opaque;
bus->nirq = nirq;
+ g_free(bus->irq_count);
bus->irq_count = g_malloc0(nirq * sizeof(bus->irq_count[0]));
}
@@ -575,6 +576,7 @@ void pci_bus_irqs_cleanup(PCIBus *bus)
bus->irq_opaque = NULL;
bus->nirq = 0;
g_free(bus->irq_count);
+ bus->irq_count = NULL;
}
PCIBus *pci_register_root_bus(DeviceState *parent, const char *name,