[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 19/22] riscv_hart: Fix riscv_harts_realize() error API violations
From: |
Markus Armbruster |
Subject: |
[PATCH 19/22] riscv_hart: Fix riscv_harts_realize() error API violations |
Date: |
Mon, 22 Jun 2020 12:42:47 +0200 |
The Error ** argument must be NULL, &error_abort, &error_fatal, or a
pointer to a variable containing NULL. Passing an argument of the
latter kind twice without clearing it in between is wrong: if the
first call sets an error, it no longer points to NULL for the second
call.
riscv_harts_realize() is wrong that way: it passes @errp to
riscv_hart_realize() in a loop. I can't tell offhand whether this can
fail.
Fix by checking for failure in each iteration.
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Alistair Francis <Alistair.Francis@wdc.com>
Cc: Sagar Karandikar <sagark@eecs.berkeley.edu>
Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: qemu-riscv@nongnu.org
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/riscv/riscv_hart.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
index e26c382259..f59fe52f0f 100644
--- a/hw/riscv/riscv_hart.c
+++ b/hw/riscv/riscv_hart.c
@@ -40,19 +40,13 @@ static void riscv_harts_cpu_reset(void *opaque)
cpu_reset(CPU(cpu));
}
-static void riscv_hart_realize(RISCVHartArrayState *s, int idx,
+static bool riscv_hart_realize(RISCVHartArrayState *s, int idx,
char *cpu_type, Error **errp)
{
- Error *err = NULL;
-
object_initialize_child(OBJECT(s), "harts[*]", &s->harts[idx], cpu_type);
s->harts[idx].env.mhartid = s->hartid_base + idx;
qemu_register_reset(riscv_harts_cpu_reset, &s->harts[idx]);
- qdev_realize(DEVICE(&s->harts[idx]), NULL, &err);
- if (err) {
- error_propagate(errp, err);
- return;
- }
+ return qdev_realize(DEVICE(&s->harts[idx]), NULL, errp);
}
static void riscv_harts_realize(DeviceState *dev, Error **errp)
@@ -63,7 +57,9 @@ static void riscv_harts_realize(DeviceState *dev, Error
**errp)
s->harts = g_new0(RISCVCPU, s->num_harts);
for (n = 0; n < s->num_harts; n++) {
- riscv_hart_realize(s, n, s->cpu_type, errp);
+ if (!riscv_hart_realize(s, n, s->cpu_type, errp)) {
+ return;
+ }
}
}
--
2.26.2
- [PATCH 09/22] sd/milkymist-memcard: Plug minor memory leak in realize, (continued)
- [PATCH 09/22] sd/milkymist-memcard: Plug minor memory leak in realize, Markus Armbruster, 2020/06/22
- [PATCH 04/22] tests: Use &error_abort where appropriate, Markus Armbruster, 2020/06/22
- [PATCH 10/22] test-util-filemonitor: Plug unlikely memory leak, Markus Armbruster, 2020/06/22
- [PATCH 03/22] Clean up some calls to ignore Error objects the right way, Markus Armbruster, 2020/06/22
- [PATCH 14/22] qdev: Drop qbus_set_bus_hotplug_handler() parameter @errp, Markus Armbruster, 2020/06/22
- [PATCH 05/22] tests: Use error_free_or_abort() where appropriate, Markus Armbruster, 2020/06/22
- [PATCH 08/22] qga: Plug unlikely memory leak in guest-set-memory-blocks, Markus Armbruster, 2020/06/22
- [PATCH 15/22] qdev: Drop qbus_set_hotplug_handler() parameter @errp, Markus Armbruster, 2020/06/22
- [PATCH 19/22] riscv_hart: Fix riscv_harts_realize() error API violations,
Markus Armbruster <=
- [PATCH 07/22] spapr: Plug minor memory leak in spapr_machine_init(), Markus Armbruster, 2020/06/22
- [PATCH 11/22] vnc: Plug minor memory leak in vnc_display_open(), Markus Armbruster, 2020/06/22
- [PATCH 22/22] amd_iommu: Fix amdvi_realize() error API violation, Markus Armbruster, 2020/06/22
- [PATCH 18/22] riscv/sifive_u: Fix sifive_u_soc_realize() error API violations, Markus Armbruster, 2020/06/22
- [PATCH 17/22] hw/arm: Drop useless object_property_set_link() error handling, Markus Armbruster, 2020/06/22
- [PATCH 01/22] net/virtio: Fix failover_replug_primary() return value regression, Markus Armbruster, 2020/06/22