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.
x86_cpu_new() is wrong that way: it passes &local_err to object_property_set_uint() without checking it, and then to qdev_realize(). Harmless, because the former can't actually fail here. Fix by checking for failure right away. While there, replace qdev_realize(); object_unref() by qdev_realize_and_unref(). Cc: Paolo Bonzini <pbonz...@redhat.com> Cc: Richard Henderson <r...@twiddle.net> Cc: Eduardo Habkost <ehabk...@redhat.com> Signed-off-by: Markus Armbruster <arm...@redhat.com> --- hw/i386/x86.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/hw/i386/x86.c b/hw/i386/x86.c index 34229b45c7..3a7029e6db 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -118,16 +118,10 @@ uint32_t x86_cpu_apic_id_from_index(X86MachineState *x86ms, void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp) { - Object *cpu = NULL; - Error *local_err = NULL; + Object *cpu = object_new(MACHINE(x86ms)->cpu_type); - cpu = object_new(MACHINE(x86ms)->cpu_type); - - object_property_set_uint(cpu, apic_id, "apic-id", &local_err); - qdev_realize(DEVICE(cpu), NULL, &local_err); - - object_unref(cpu); - error_propagate(errp, local_err); + object_property_set_uint(cpu, apic_id, "apic-id", &error_abort); + qdev_realize_and_unref(DEVICE(cpu), NULL, errp); } void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version) -- 2.26.2