The commit in the fixes line moved multifd thread creation to a different location, but forgot to move the p->running = true assignment as well. Thus, p->running is set to true before multifd thread is actually created.
p->running is used in multifd_save_cleanup() to decide whether to join the multifd thread or not. With TLS, an error in multifd_tls_channel_connect() can lead to a segmentation fault because p->running is true but p->thread is never initialized, so multifd_save_cleanup() tries to join an uninitialized thread. Fix it by moving p->running = true assignment right after multifd thread creation. Also move qio_channel_set_delay() to there, as this is where it used to be originally. Fixes: 29647140157a ("migration/tls: add support for multifd tls-handshake") Signed-off-by: Avihai Horon <avih...@nvidia.com> --- migration/multifd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/migration/multifd.c b/migration/multifd.c index 25cbc6dc6b..564e911b6c 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -850,11 +850,13 @@ static bool multifd_channel_connect(MultiFDSendParams *p, return multifd_tls_channel_connect(p, ioc, errp); } + qio_channel_set_delay(ioc, false); migration_ioc_register_yank(ioc); p->registered_yank = true; p->c = ioc; qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); + p->running = true; return true; } @@ -883,8 +885,6 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) trace_multifd_new_send_channel_async(p->id); if (!qio_task_propagate_error(task, &local_err)) { - qio_channel_set_delay(ioc, false); - p->running = true; if (multifd_channel_connect(p, ioc, &local_err)) { return; } -- 2.26.3