[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 10/10] migration/multifd: Duplicate the fd for the outgoing_args
From: |
peterx |
Subject: |
[PULL 10/10] migration/multifd: Duplicate the fd for the outgoing_args |
Date: |
Sun, 17 Mar 2024 16:58:03 -0400 |
From: Fabiano Rosas <farosas@suse.de>
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: 20240315032040.7974-3-farosas@suse.de">https://lore.kernel.org/r/20240315032040.7974-3-farosas@suse.de
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/fd.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/migration/fd.c b/migration/fd.c
index c07030f715..fe0d096abd 100644
--- a/migration/fd.c
+++ b/migration/fd.c
@@ -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);
--
2.44.0
- [PULL 00/10] Migration 20240317 patches, peterx, 2024/03/17
- [PULL 01/10] io: Introduce qio_channel_file_new_dupfd, peterx, 2024/03/17
- [PULL 02/10] migration: Fix error handling after dup in file migration, peterx, 2024/03/17
- [PULL 03/10] physmem: Expose tlb_reset_dirty_range_all(), peterx, 2024/03/17
- [PULL 04/10] physmem: Factor cpu_physical_memory_dirty_bits_cleared() out, peterx, 2024/03/17
- [PULL 05/10] physmem: Fix migration dirty bitmap coherency with TCG memory access, peterx, 2024/03/17
- [PULL 06/10] migration: Skip only empty block devices, peterx, 2024/03/17
- [PULL 07/10] migration: cpr-reboot documentation, peterx, 2024/03/17
- [PULL 09/10] migration/multifd: Ensure we're not given a socket for file migration, peterx, 2024/03/17
- [PULL 08/10] migration: Fix iocs leaks during file and fd migration, peterx, 2024/03/17
- [PULL 10/10] migration/multifd: Duplicate the fd for the outgoing_args,
peterx <=
- Re: [PULL 00/10] Migration 20240317 patches, Peter Maydell, 2024/03/19