target-i386: Fix X86CPU error handling

Error **errp argument is not for emitting warnings, it means an error
has occurred and the caller should not make any assumptions about the
state of other return values (unless otherwise documented).

Therefore cpu_x86_create() must unref the new X86CPU itself, and
pc_new_cpu() must check for an Error rather than NULL return value.

While at it, clean up a superfluous NULL check.

Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
Cc: qemu-stable@nongnu.org
Cc: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
(cherry picked from commit cd7b87ffe9)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Andreas Färber 2013-08-02 18:56:05 +02:00 committed by Michael Roth
parent ca73e42f6d
commit 4055390051
2 changed files with 11 additions and 8 deletions

View File

@ -902,20 +902,19 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
X86CPU *cpu; X86CPU *cpu;
Error *local_err = NULL; Error *local_err = NULL;
cpu = cpu_x86_create(cpu_model, icc_bridge, errp); cpu = cpu_x86_create(cpu_model, icc_bridge, &local_err);
if (!cpu) { if (local_err != NULL) {
return cpu; error_propagate(errp, local_err);
return NULL;
} }
object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err); object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err); object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
if (local_err) { if (local_err) {
if (cpu != NULL) {
object_unref(OBJECT(cpu));
cpu = NULL;
}
error_propagate(errp, local_err); error_propagate(errp, local_err);
object_unref(OBJECT(cpu));
cpu = NULL;
} }
return cpu; return cpu;
} }

View File

@ -1820,7 +1820,11 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
} }
out: out:
error_propagate(errp, error); if (error != NULL) {
error_propagate(errp, error);
object_unref(OBJECT(cpu));
cpu = NULL;
}
g_strfreev(model_pieces); g_strfreev(model_pieces);
return cpu; return cpu;
} }