summaryrefslogtreecommitdiffstats
path: root/hw/ppc/spapr_cpu_core.c
diff options
context:
space:
mode:
authorGreg Kurz2018-06-14 23:50:27 +0200
committerDavid Gibson2018-06-16 08:32:33 +0200
commit27607c1cdc0d2939cc3059106f919bf6271ae652 (patch)
tree984217ed39274ac4cd048da4508e4cf76fcc875b /hw/ppc/spapr_cpu_core.c
parentspapr_cpu_core: convert last snprintf() to g_strdup_printf() (diff)
downloadqemu-27607c1cdc0d2939cc3059106f919bf6271ae652.tar.gz
qemu-27607c1cdc0d2939cc3059106f919bf6271ae652.tar.xz
qemu-27607c1cdc0d2939cc3059106f919bf6271ae652.zip
spapr_cpu_core: fix potential leak in spapr_cpu_core_realize()
Commit 94ad93bd97684 (QEMU 2.12) switched to instantiate CPUs separately but it missed to adapt the error path accordingly. If something fails in the CPU creation loop, then the CPU object that was just created is leaked. The error paths in this function are a bit obfuscated, and adding yet another label to free this CPU object makes it worse. We should move the block of the loop to a separate function, with a proper rollback path, but this is a bigger cleanup. For now, let's just fix the bug by adding the missing calls to object_unref(). This will allow easier backport to older QEMU versions. Signed-off-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw/ppc/spapr_cpu_core.c')
-rw-r--r--hw/ppc/spapr_cpu_core.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index ad404d13ec..a9bb2d61e8 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -187,6 +187,7 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
cs->cpu_index = cc->core_id + i;
spapr_set_vcpu_id(cpu, cs->cpu_index, &local_err);
if (local_err) {
+ object_unref(obj);
goto err;
}
@@ -198,6 +199,7 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
object_property_add_child(OBJECT(sc), id, obj, &local_err);
g_free(id);
if (local_err) {
+ object_unref(obj);
goto err;
}
object_unref(obj);