summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorMichael Roth <mdroth@linux.vnet.ibm.com>2013-02-04 10:07:51 -0600
committerAnthony Liguori <aliguori@us.ibm.com>2013-02-04 14:39:07 -0600
commitded67782e6d06069873adce7f9074d273ae75760 (patch)
tree9abf9d4193ce0d0cd6708781c8ac80a1a6c19327 /hw
parentc881e20eed4911ab6f8c674f2b1bf225a2cdde71 (diff)
downloadqemu-ded67782e6d06069873adce7f9074d273ae75760.tar.gz
qemu-ded67782e6d06069873adce7f9074d273ae75760.tar.bz2
qemu-ded67782e6d06069873adce7f9074d273ae75760.zip
acpi_piix4: fix segfault migrating from 1.2
b0b873a07872f7ab7f66f259c73fb9dd42aa66a9 bumped the vmstate version and introduced an old-style load function to handle migration from prior (<= 1.2) versions. The load function passes the top-level PIIX4PMState pointer to vmstate_load_state() to handle nested structs for APMState and pci_status, which leads to corruption of the top-level PIIX4PMState, since pointers to the nested structs are expected. A segfault can be fairly reliably triggered by migrating from 1.2 and issuing a reset, which will trigger a number of QOM operations which rely on the now corrupted ObjectClass/Object members. Fix this by passing in the expected pointers for vmstate_load_state(). Cc: qemu-stable@nongnu.org Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/acpi_piix4.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 0d33849e95..65b26013bd 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -235,7 +235,7 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id)
qemu_get_be16s(f, &s->ar.pm1.evt.en);
qemu_get_be16s(f, &s->ar.pm1.cnt.cnt);
- ret = vmstate_load_state(f, &vmstate_apm, opaque, 1);
+ ret = vmstate_load_state(f, &vmstate_apm, &s->apm, 1);
if (ret) {
return ret;
}
@@ -253,7 +253,7 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id)
qemu_get_be16s(f, &temp);
}
- ret = vmstate_load_state(f, &vmstate_pci_status, opaque, 1);
+ ret = vmstate_load_state(f, &vmstate_pci_status, &s->pci0_status, 1);
return ret;
}