mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 11:39:53 +00:00
dump: Fix dump-guest-memory termination and use-after-close
dump_iterate() dumps blocks in a loop. Eventually, get_next_block() returns "no more". We then call dump_completed(). But we neglect to break the loop! Broken in commit4c7e251a
. Because of that, we dump the last block again. This attempts to write to s->fd, which fails if we're lucky. The error makes dump_iterate() return failure. It's the only way it can ever return. Theoretical: if we're not so lucky, something else has opened something for writing and got the same fd. dump_iterate() then keeps looping, messing up the something else's output, until a write fails, or the process mercifully terminates. The obvious fix is to restore the return lost in commit4c7e251a
. But the root cause of the bug is needlessly opaque loop control. Replace it by a clean do ... while loop. This makes the badly chosen return values of get_next_block() more visible. Cleaning that up is outside the scope of this bug fix. Signed-off-by: Gonglei <arei.gonglei@huawei.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
7d5a8435ba
commit
08a655be71
11
dump.c
11
dump.c
@ -604,10 +604,9 @@ static void dump_iterate(DumpState *s, Error **errp)
|
|||||||
{
|
{
|
||||||
GuestPhysBlock *block;
|
GuestPhysBlock *block;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
int ret;
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
while (1) {
|
do {
|
||||||
block = s->next_block;
|
block = s->next_block;
|
||||||
|
|
||||||
size = block->target_end - block->target_start;
|
size = block->target_end - block->target_start;
|
||||||
@ -623,11 +622,9 @@ static void dump_iterate(DumpState *s, Error **errp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = get_next_block(s, block);
|
} while (!get_next_block(s, block));
|
||||||
if (ret == 1) {
|
|
||||||
dump_completed(s);
|
dump_completed(s);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_vmcore(DumpState *s, Error **errp)
|
static void create_vmcore(DumpState *s, Error **errp)
|
||||||
|
Loading…
Reference in New Issue
Block a user