mirror of https://github.com/xemu-project/xemu.git
vmstate: Avoid seeking
Seeking on vmstate save/load does not work if the underlying file is a stream. We could try to make all QEMUFile* forward-seek-aware, but first attempts in this direction indicated that it's saner to convert the few qemu_fseek-on-vmstates users to plain reads/writes. This fixes various subtle vmstate corruptions where unused fields were involved. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
e560125e26
commit
21174c34b6
20
savevm.c
20
savevm.c
|
@ -959,13 +959,27 @@ const VMStateInfo vmstate_info_buffer = {
|
|||
|
||||
static int get_unused_buffer(QEMUFile *f, void *pv, size_t size)
|
||||
{
|
||||
qemu_fseek(f, size, SEEK_CUR);
|
||||
return 0;
|
||||
uint8_t buf[1024];
|
||||
int block_len;
|
||||
|
||||
while (size > 0) {
|
||||
block_len = MIN(sizeof(buf), size);
|
||||
size -= block_len;
|
||||
qemu_get_buffer(f, buf, block_len);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void put_unused_buffer(QEMUFile *f, void *pv, size_t size)
|
||||
{
|
||||
qemu_fseek(f, size, SEEK_CUR);
|
||||
static const uint8_t buf[1024];
|
||||
int block_len;
|
||||
|
||||
while (size > 0) {
|
||||
block_len = MIN(sizeof(buf), size);
|
||||
size -= block_len;
|
||||
qemu_put_buffer(f, buf, block_len);
|
||||
}
|
||||
}
|
||||
|
||||
const VMStateInfo vmstate_info_unused_buffer = {
|
||||
|
|
Loading…
Reference in New Issue