On Wed, 24 Jun 2020 10:37:32 +0200 Markus Armbruster <arm...@redhat.com> wrote:
> 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); it may fail here if user specified wrong cpu flags, but there is nothing we can do to fix it. perhaps error_fatal would suit this case better? > + qdev_realize_and_unref(DEVICE(cpu), NULL, errp); > } > > void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version)