summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Färber <afaerber@suse.de>2013-08-02 18:56:05 +0200
committerMichael Roth <mdroth@linux.vnet.ibm.com>2013-08-13 09:30:50 -0500
commit405539005133bc3e7bb0c016ede3167eafac1df9 (patch)
treef90a7d53e56d87283cbe01755800a228e246b22e
parentca73e42f6d9581f785ff12a441501d94a97f5532 (diff)
downloadqemu-405539005133bc3e7bb0c016ede3167eafac1df9.tar.gz
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 cd7b87ffe9b6b7b0089ec8c71555f3b942bc6daf) Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
-rw-r--r--hw/i386/pc.c13
-rw-r--r--target-i386/cpu.c6
2 files changed, 11 insertions, 8 deletions
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index e2c44f8882..a7ecfb0586 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -902,20 +902,19 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
X86CPU *cpu;
Error *local_err = NULL;
- cpu = cpu_x86_create(cpu_model, icc_bridge, errp);
- if (!cpu) {
- return cpu;
+ cpu = cpu_x86_create(cpu_model, icc_bridge, &local_err);
+ if (local_err != NULL) {
+ error_propagate(errp, local_err);
+ return NULL;
}
object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
if (local_err) {
- if (cpu != NULL) {
- object_unref(OBJECT(cpu));
- cpu = NULL;
- }
error_propagate(errp, local_err);
+ object_unref(OBJECT(cpu));
+ cpu = NULL;
}
return cpu;
}
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index ae8e68271b..cdae1cea58 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1820,7 +1820,11 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
}
out:
- error_propagate(errp, error);
+ if (error != NULL) {
+ error_propagate(errp, error);
+ object_unref(OBJECT(cpu));
+ cpu = NULL;
+ }
g_strfreev(model_pieces);
return cpu;
}