migration/multifd: Duplicate the fd for the outgoing_args
We currently store the file descriptor used during the main outgoing channel creation to use it again when creating the multifd channels. Since this fd is used for the first iochannel, there's risk that the QIOChannel gets freed and the fd closed while outgoing_args.fd still has it available. This could lead to an fd-reuse bug. Duplicate the outgoing_args fd to avoid this issue. Suggested-by: Peter Xu <peterx@redhat.com> Signed-off-by: Fabiano Rosas <farosas@suse.de> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/r/20240315032040.7974-3-farosas@suse.de Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
parent
73f6f9a12f
commit
9adfb308c1
@ -49,8 +49,7 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **
|
||||
{
|
||||
QIOChannel *ioc;
|
||||
int fd = monitor_get_fd(monitor_cur(), fdname, errp);
|
||||
|
||||
outgoing_args.fd = -1;
|
||||
int newfd;
|
||||
|
||||
if (fd == -1) {
|
||||
return;
|
||||
@ -63,7 +62,17 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **
|
||||
return;
|
||||
}
|
||||
|
||||
outgoing_args.fd = fd;
|
||||
/*
|
||||
* This is dup()ed just to avoid referencing an fd that might
|
||||
* be already closed by the iochannel.
|
||||
*/
|
||||
newfd = dup(fd);
|
||||
if (newfd == -1) {
|
||||
error_setg_errno(errp, errno, "Could not dup FD %d", fd);
|
||||
object_unref(ioc);
|
||||
return;
|
||||
}
|
||||
outgoing_args.fd = newfd;
|
||||
|
||||
qio_channel_set_name(ioc, "migration-fd-outgoing");
|
||||
migration_channel_connect(s, ioc, NULL, NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user