mirror of https://gitee.com/openkylin/qemu.git
check_section_footers: Check the correct section_id
The section footers check was incorrectly checking the section_id in the SaveStateEntry not the LoadStateEntry. These can validly be different if the two QEMU instances have instantiated their devices in a different order. The test only cares that we're finishing the same section we started, and hence it's the LoadStateEntry that we care about. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reported-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
7cf1fe6d68
commit
59f39a4741
|
@ -697,41 +697,6 @@ static void save_section_footer(QEMUFile *f, SaveStateEntry *se)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a footer off the wire and check that it matches the expected section
|
|
||||||
*
|
|
||||||
* Returns: true if the footer was good
|
|
||||||
* false if there is a problem (and calls error_report to say why)
|
|
||||||
*/
|
|
||||||
static bool check_section_footer(QEMUFile *f, SaveStateEntry *se)
|
|
||||||
{
|
|
||||||
uint8_t read_mark;
|
|
||||||
uint32_t read_section_id;
|
|
||||||
|
|
||||||
if (skip_section_footers) {
|
|
||||||
/* No footer to check */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_mark = qemu_get_byte(f);
|
|
||||||
|
|
||||||
if (read_mark != QEMU_VM_SECTION_FOOTER) {
|
|
||||||
error_report("Missing section footer for %s", se->idstr);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_section_id = qemu_get_be32(f);
|
|
||||||
if (read_section_id != se->section_id) {
|
|
||||||
error_report("Mismatched section id in footer for %s -"
|
|
||||||
" read 0x%x expected 0x%x",
|
|
||||||
se->idstr, read_section_id, se->section_id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All good */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool qemu_savevm_state_blocked(Error **errp)
|
bool qemu_savevm_state_blocked(Error **errp)
|
||||||
{
|
{
|
||||||
SaveStateEntry *se;
|
SaveStateEntry *se;
|
||||||
|
@ -1046,6 +1011,41 @@ struct LoadStateEntry {
|
||||||
int version_id;
|
int version_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a footer off the wire and check that it matches the expected section
|
||||||
|
*
|
||||||
|
* Returns: true if the footer was good
|
||||||
|
* false if there is a problem (and calls error_report to say why)
|
||||||
|
*/
|
||||||
|
static bool check_section_footer(QEMUFile *f, LoadStateEntry *le)
|
||||||
|
{
|
||||||
|
uint8_t read_mark;
|
||||||
|
uint32_t read_section_id;
|
||||||
|
|
||||||
|
if (skip_section_footers) {
|
||||||
|
/* No footer to check */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_mark = qemu_get_byte(f);
|
||||||
|
|
||||||
|
if (read_mark != QEMU_VM_SECTION_FOOTER) {
|
||||||
|
error_report("Missing section footer for %s", le->se->idstr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_section_id = qemu_get_be32(f);
|
||||||
|
if (read_section_id != le->section_id) {
|
||||||
|
error_report("Mismatched section id in footer for %s -"
|
||||||
|
" read 0x%x expected 0x%x",
|
||||||
|
le->se->idstr, read_section_id, le->section_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All good */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void loadvm_free_handlers(MigrationIncomingState *mis)
|
void loadvm_free_handlers(MigrationIncomingState *mis)
|
||||||
{
|
{
|
||||||
LoadStateEntry *le, *new_le;
|
LoadStateEntry *le, *new_le;
|
||||||
|
@ -1151,7 +1151,7 @@ int qemu_loadvm_state(QEMUFile *f)
|
||||||
" device '%s'", instance_id, idstr);
|
" device '%s'", instance_id, idstr);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!check_section_footer(f, le->se)) {
|
if (!check_section_footer(f, le)) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1178,7 +1178,7 @@ int qemu_loadvm_state(QEMUFile *f)
|
||||||
section_id, le->se->idstr);
|
section_id, le->se->idstr);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!check_section_footer(f, le->se)) {
|
if (!check_section_footer(f, le)) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue