hw/pci-host/astro: Don't call pci_regsiter_root_bus() in init
In the astro PCI host bridge device, we call pci_register_root_bus()
in the device's instance_init. This is a problem for two reasons
* the PCI bridge is then available to the rest of the simulation
(e.g. via pci_qdev_find_device()), even though it hasn't
yet been realized
* we do not attempt to unregister in an instance_deinit,
which means that if you go through an instance_init -> deinit
lifecycle the freed memory for the host-bridge device is
left on the pci_host_bridges list
ASAN reports the resulting use-after-free:
==1776584==ERROR: AddressSanitizer: heap-use-after-free on address 0x51f00000cb00 at pc 0x5b2d460a89b5 bp 0x7ffef7617f50 sp 0x7ffef7617f48
WRITE of size 8 at 0x51f00000cb00 thread T0
#0 0x5b2d460a89b4 in pci_host_bus_register /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../hw/pci/pci.c:608:5
#1 0x5b2d46093566 in pci_root_bus_internal_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../hw/pci/pci.c:677:5
#2 0x5b2d460935e0 in pci_root_bus_new /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../hw/pci/pci.c:706:5
#3 0x5b2d46093fe5 in pci_register_root_bus /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../hw/pci/pci.c:751:11
#4 0x5b2d46fe2335 in elroy_pcihost_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../hw/pci-host/astro.c:455:16
0x51f00000cb00 is located 1664 bytes inside of 3456-byte region [0x51f00000c480,0x51f00000d200)
freed by thread T0 here:
#0 0x5b2d4582385a in free (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/qemu-system-hppa+0x17ad85a) (BuildId: 692b49eedc6fb0ef618bbb6784a09311b3b7f1e8)
#1 0x5b2d47160723 in object_finalize /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/object.c:734:9
#2 0x5b2d471589db in object_unref /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/object.c:1232:9
#3 0x5b2d477d373c in qmp_device_list_properties /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/qom-qmp-cmds.c:237:5
previously allocated by thread T0 here:
#0 0x5b2d45823af3 in malloc (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/qemu-system-hppa+0x17adaf3) (BuildId: 692b49eedc6fb0ef618bbb6784a09311b3b7f1e8)
#1 0x79728fa08b09 in g_malloc (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x62b09) (BuildId: 1eb6131419edb83b2178b682829a6913cf682d75)
#2 0x5b2d471595fc in object_new_with_type /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/object.c:767:15
#3 0x5b2d47159409 in object_new_with_class /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/object.c:782:12
#4 0x5b2d477d29a5 in qmp_device_list_properties /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/hppa-asan/../../qom/qom-qmp-cmds.c:206:11
Cc: qemu-stable@nongnu.org
Fixes: e029bb00a7 ("hw/pci-host: Add Astro system bus adapter found on PA-RISC machines")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3118
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20250918114259.1802337-3-peter.maydell@linaro.org>
This commit is contained in:
parent
e4a1b308b2
commit
76d2b8d42a
1 changed files with 14 additions and 13 deletions
|
|
@ -424,22 +424,23 @@ static void elroy_reset(DeviceState *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static void elroy_pcihost_init(Object *obj)
|
||||
static void elroy_pcihost_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ElroyState *s = ELROY_PCI_HOST_BRIDGE(obj);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
ElroyState *s = ELROY_PCI_HOST_BRIDGE(dev);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(dev);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
Object *obj = OBJECT(s);
|
||||
|
||||
/* Elroy config access from CPU. */
|
||||
memory_region_init_io(&s->this_mem, OBJECT(s), &elroy_chip_ops,
|
||||
memory_region_init_io(&s->this_mem, obj, &elroy_chip_ops,
|
||||
s, "elroy", 0x2000);
|
||||
|
||||
/* Elroy PCI config. */
|
||||
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
|
||||
&elroy_config_addr_ops, DEVICE(s),
|
||||
memory_region_init_io(&phb->conf_mem, obj,
|
||||
&elroy_config_addr_ops, dev,
|
||||
"pci-conf-idx", 8);
|
||||
memory_region_init_io(&phb->data_mem, OBJECT(phb),
|
||||
&elroy_config_data_ops, DEVICE(s),
|
||||
memory_region_init_io(&phb->data_mem, obj,
|
||||
&elroy_config_data_ops, dev,
|
||||
"pci-conf-data", 8);
|
||||
memory_region_add_subregion(&s->this_mem, 0x40,
|
||||
&phb->conf_mem);
|
||||
|
|
@ -447,8 +448,8 @@ static void elroy_pcihost_init(Object *obj)
|
|||
&phb->data_mem);
|
||||
|
||||
/* Elroy PCI bus memory. */
|
||||
memory_region_init(&s->pci_mmio, OBJECT(s), "pci-mmio", UINT64_MAX);
|
||||
memory_region_init_io(&s->pci_io, OBJECT(s), &unassigned_io_ops, obj,
|
||||
memory_region_init(&s->pci_mmio, obj, "pci-mmio", UINT64_MAX);
|
||||
memory_region_init_io(&s->pci_io, obj, &unassigned_io_ops, obj,
|
||||
"pci-isa-mmio",
|
||||
((uint32_t) IOS_DIST_BASE_SIZE) / ROPES_PER_IOC);
|
||||
|
||||
|
|
@ -459,7 +460,7 @@ static void elroy_pcihost_init(Object *obj)
|
|||
|
||||
sysbus_init_mmio(sbd, &s->this_mem);
|
||||
|
||||
qdev_init_gpio_in(DEVICE(obj), elroy_set_irq, ELROY_IRQS);
|
||||
qdev_init_gpio_in(dev, elroy_set_irq, ELROY_IRQS);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_elroy = {
|
||||
|
|
@ -487,6 +488,7 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data)
|
|||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
device_class_set_legacy_reset(dc, elroy_reset);
|
||||
dc->realize = elroy_pcihost_realize;
|
||||
dc->vmsd = &vmstate_elroy;
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
|
|
@ -494,7 +496,6 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data)
|
|||
static const TypeInfo elroy_pcihost_info = {
|
||||
.name = TYPE_ELROY_PCI_HOST_BRIDGE,
|
||||
.parent = TYPE_PCI_HOST_BRIDGE,
|
||||
.instance_init = elroy_pcihost_init,
|
||||
.instance_size = sizeof(ElroyState),
|
||||
.class_init = elroy_pcihost_class_init,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue