Skip to content
  • Gonglei's avatar
    dump: Fix dump-guest-memory termination and use-after-close · 08a655be
    Gonglei authored
    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 commit 4c7e251a.
    
    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 commit 4c7e251a
    
    .  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: default avatarGonglei <arei.gonglei@huawei.com>
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Signed-off-by: default avatarMichael Tokarev <mjt@tls.msk.ru>
    08a655be