]> git.ipfire.org Git - thirdparty/qemu.git/commit
migration: Ensure vmstate_save() sets errp
authorHanna Czenczek <hreitz@redhat.com>
Tue, 15 Oct 2024 17:04:37 +0000 (19:04 +0200)
committerMichael Tokarev <mjt@tls.msk.ru>
Wed, 6 Nov 2024 20:09:09 +0000 (23:09 +0300)
commit0098207eb1d958600b80705f3be0b2064d232178
tree167ad715aa6ff48d2579ff2a74a91a6fbc6d3d19
parent5e29203bc7428d77f940d6427557a3b258e2224c
migration: Ensure vmstate_save() sets errp

migration/savevm.c contains some calls to vmstate_save() that are
followed by migrate_set_error() if the integer return value indicates an
error.  migrate_set_error() requires that the `Error *` object passed to
it is set.  Therefore, vmstate_save() is assumed to always set *errp on
error.

Right now, that assumption is not met: vmstate_save_state_v() (called
internally by vmstate_save()) will not set *errp if
vmstate_subsection_save() or vmsd->post_save() fail.  Fix that by adding
an *errp parameter to vmstate_subsection_save(), and by generating a
generic error in case post_save() fails (as is already done for
pre_save()).

Without this patch, qemu will crash after vmstate_subsection_save() or
post_save() have failed inside of a vmstate_save() call (unless
migrate_set_error() then happen to discard the new error because
s->error is already set).  This happens e.g. when receiving the state
from a virtio-fs back-end (virtiofsd) fails.

Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
Link: https://lore.kernel.org/r/20241015170437.310358-1-hreitz@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
(cherry picked from commit 37dfcba1a04989830c706f9cbc00450e5d3a7447)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
migration/vmstate.c