migration: Fix parse_ramblock() on overwritten retvals

It's possible that some errors can be overwritten with success retval later
on, and then ignored.  Always capture all errors and report.

Reported by Coverity 1522861, but actually I spot one more in the same
function.

Fixes: CID 1522861
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Message-ID: <20231017203855.298260-1-peterx@redhat.com>
This commit is contained in:
Peter Xu 2023-10-17 16:38:55 -04:00 committed by Juan Quintela
parent c8a7fc5179
commit 2c36076a11
1 changed files with 3 additions and 2 deletions

View File

@ -3873,6 +3873,7 @@ static int parse_ramblock(QEMUFile *f, RAMBlock *block, ram_addr_t length)
ret = qemu_ram_resize(block, length, &local_err); ret = qemu_ram_resize(block, length, &local_err);
if (local_err) { if (local_err) {
error_report_err(local_err); error_report_err(local_err);
return ret;
} }
} }
/* For postcopy we need to check hugepage sizes match */ /* For postcopy we need to check hugepage sizes match */
@ -3883,7 +3884,7 @@ static int parse_ramblock(QEMUFile *f, RAMBlock *block, ram_addr_t length)
error_report("Mismatched RAM page size %s " error_report("Mismatched RAM page size %s "
"(local) %zd != %" PRId64, block->idstr, "(local) %zd != %" PRId64, block->idstr,
block->page_size, remote_page_size); block->page_size, remote_page_size);
ret = -EINVAL; return -EINVAL;
} }
} }
if (migrate_ignore_shared()) { if (migrate_ignore_shared()) {
@ -3893,7 +3894,7 @@ static int parse_ramblock(QEMUFile *f, RAMBlock *block, ram_addr_t length)
error_report("Mismatched GPAs for block %s " error_report("Mismatched GPAs for block %s "
"%" PRId64 "!= %" PRId64, block->idstr, "%" PRId64 "!= %" PRId64, block->idstr,
(uint64_t)addr, (uint64_t)block->mr->addr); (uint64_t)addr, (uint64_t)block->mr->addr);
ret = -EINVAL; return -EINVAL;
} }
} }
ret = rdma_block_notification_handle(f, block->idstr); ret = rdma_block_notification_handle(f, block->idstr);