migration: Fix migration_channel_read_peek() error path
migration_channel_read_peek() calls qio_channel_readv_full() and handles
both cases of return value == 0 and return value < 0 the same way, by
calling error_setg() with errp. However, if return value < 0, errp is
already set, so calling error_setg() with errp will lead to an assert.
Fix it by handling these cases separately, calling error_setg() with
errp only in return value == 0 case.
Fixes: 6720c2b327
("migration: check magic value for deciding the mapping of channels")
Signed-off-by: Avihai Horon <avihaih@nvidia.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Link: https://lore.kernel.org/r/20231231093016.14204-10-avihaih@nvidia.com
Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
parent
1d3886f837
commit
4f8cf323e8
@ -117,9 +117,12 @@ int migration_channel_read_peek(QIOChannel *ioc,
|
|||||||
len = qio_channel_readv_full(ioc, &iov, 1, NULL, NULL,
|
len = qio_channel_readv_full(ioc, &iov, 1, NULL, NULL,
|
||||||
QIO_CHANNEL_READ_FLAG_MSG_PEEK, errp);
|
QIO_CHANNEL_READ_FLAG_MSG_PEEK, errp);
|
||||||
|
|
||||||
if (len <= 0 && len != QIO_CHANNEL_ERR_BLOCK) {
|
if (len < 0 && len != QIO_CHANNEL_ERR_BLOCK) {
|
||||||
error_setg(errp,
|
return -1;
|
||||||
"Failed to peek at channel");
|
}
|
||||||
|
|
||||||
|
if (len == 0) {
|
||||||
|
error_setg(errp, "Failed to peek at channel");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user