@samitouri / QOSamiQemu / commits / d41ce10d0f

migration: vmstate_save_state_v: fix double error_setg

We may call error_setg twice on same errp if inner vmstate_save_state_v() or vmstate_save_state() call fails. Next we will crash on assertion in error_setv(). Fixes: 848a0503422d043 "migration: Update error description outside migration.c" Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/qemu-devel/20260304212303.667141-2-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>

Vladimir Sementsov-Ogievskiy committed Mar 5, 2026 at 00:22 UTC d41ce10d0f5a3d6e497e4b75807a8e675033c597
1 file changed +5 -2
migration/vmstate.c
+5 -2
@@ -539,6 +539,9 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
539 } else {
540 ret = inner_field->info->put(f, curr_elem, size,
541 inner_field, vmdesc_loop);
542 + if (ret < 0) {
543 + error_setg(errp, "put failed");
544 + }
545 }
546
547 written_bytes = qemu_file_transferred(f) - old_offset;
@@ -551,8 +554,8 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
554 }
555
556 if (ret) {
554 - error_setg(errp, "Save of field %s/%s failed",
555 - vmsd->name, field->name);
557 + error_prepend(errp, "Save of field %s/%s failed: ",
558 + vmsd->name, field->name);
559 if (vmsd->post_save) {
560 vmsd->post_save(opaque);
561 }