public inbox for dev@dpdk.org
 help / color / mirror / Atom feed
* [PATCH] vhost: fix use-after-free in fdset during shutdown
@ 2026-02-04 18:03 Yehor Malikov
  2026-02-04 18:48 ` [PATCH v2] " malikovyehor
  0 siblings, 1 reply; 23+ messages in thread
From: Yehor Malikov @ 2026-02-04 18:03 UTC (permalink / raw)
  To: dev@dpdk.org; +Cc: maxime.coquelin@redhat.com, chenbox@nvidia.com

[-- Attachment #1: Type: text/plain, Size: 4342 bytes --]

From ecc4db77657e4a1388d3799883238adf6d693c73 Mon Sep 17 00:00:00 2001
From: Yehor Malikov <Yehor.Malikov@solidigm.com>
Date: Wed, 4 Feb 2026 11:58:15 +0100
Subject: [PATCH] vhost: fix use-after-free in fdset during shutdown

The fdset_event_dispatch thread runs in a loop checking the destroy
flag after each epoll_wait iteration. During process exit,
rte_eal_cleanup() frees hugepages memory while the fdset thread is
still running, causing use-after-free when accessing the fdset
structure.

Add fdset_deinit() function to properly stop the dispatch thread
before freeing resources:
- Set destroy flag to signal thread exit
- Wait for thread completion via rte_thread_join()
- Close epoll fd and free memory only after thread exits

Add RTE_FINI destructor to ensure fdset cleanup runs before EAL
cleanup frees hugepages.

Fixes: e68a6feaa3b3 ("vhost: improve fdset initialization")

Signed-off-by: Yehor Malikov <Yehor.Malikov@solidigm.com>
---
 .mailmap           |  1 +
 lib/vhost/fd_man.c | 33 +++++++++++++++++++++++++++++++++
 lib/vhost/fd_man.h |  1 +
 lib/vhost/socket.c |  8 ++++++++
 4 files changed, 43 insertions(+)

diff --git a/.mailmap b/.mailmap
index 34a99f93a1..6fb87ca810 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1800,6 +1800,7 @@ Yaron Illouz <yaroni@radcom.com>
 Yaroslav Brustinov <ybrustin@cisco.com>
 Yash Sharma <ysharma@marvell.com>
 Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp> <yasufum.o@gmail.com>
+Yehor Malikov <Yehor.Malikov@solidigm.com>
 Yelena Krivosheev <yelena@marvell.com>
 Yerden Zhumabekov <e_zhumabekov@sts.kz> <yerden.zhumabekov@sts.kz>
 Yevgeny Kliteynik <kliteyn@nvidia.com>
diff --git a/lib/vhost/fd_man.c b/lib/vhost/fd_man.c
index f9147edee7..4c759d44a4 100644
--- a/lib/vhost/fd_man.c
+++ b/lib/vhost/fd_man.c
@@ -149,6 +149,39 @@ fdset_init(const char *name)
        return NULL;
 }

+void
+fdset_deinit(struct fdset *pfdset)
+{
+       unsigned int val;
+       int i;
+
+       if (pfdset == NULL)
+               return;
+
+       /* Signal the dispatch thread to stop */
+       pfdset->destroy = true;
+
+       /* Wait for the dispatch thread to exit */
+       if (rte_thread_join(pfdset->tid, &val) != 0)
+               VHOST_FDMAN_LOG(ERR, "Failed to join %s event dispatch thread", pfdset->name);
+
+       /* Close epoll fd */
+       close(pfdset->epfd);
+
+       /* Remove from global fdsets list */
+       pthread_mutex_lock(&fdsets_mutex);
+       for (i = 0; i < MAX_FDSETS; i++) {
+               if (fdsets[i] == pfdset) {
+                       fdsets[i] = NULL;
+                       break;
+               }
+       }
+       pthread_mutex_unlock(&fdsets_mutex);
+
+       /* Free the fdset */
+       rte_free(pfdset);
+}
+
 static int
 fdset_insert_entry(struct fdset *pfdset, int fd, fd_cb rcb, fd_cb wcb, void *dat)
 {
diff --git a/lib/vhost/fd_man.h b/lib/vhost/fd_man.h
index eadcc6fb42..c9e51badaa 100644
--- a/lib/vhost/fd_man.h
+++ b/lib/vhost/fd_man.h
@@ -15,6 +15,7 @@ struct fdset;
 typedef void (*fd_cb)(int fd, void *dat, int *close);

 struct fdset *fdset_init(const char *name);
+void fdset_deinit(struct fdset *pfdset);

 int fdset_add(struct fdset *pfdset, int fd,
        fd_cb rcb, fd_cb wcb, void *dat);
diff --git a/lib/vhost/socket.c b/lib/vhost/socket.c
index 9b4f332f94..e953dd1849 100644
--- a/lib/vhost/socket.c
+++ b/lib/vhost/socket.c
@@ -1209,3 +1209,11 @@ rte_vhost_driver_start(const char *path)
        else
                return vhost_user_start_client(vsocket);
 }
+
+RTE_FINI(vhost_user_fdset_fini)
+{
+       if (vhost_user.fdset != NULL) {
+               fdset_deinit(vhost_user.fdset);
+               vhost_user.fdset = NULL;
+       }
+}
--
2.51.1


CONFIDENTIALITY NOTICE: This email and any files attached may contain confidential information and may be restricted from disclosure by corporate confidentiality guidelines, or applicable state and federal law. It is intended solely for the use of the person or entity to whom the email was addressed. If you are not the intended recipient of this message, be advised that any dissemination, distribution, or use of the contents of this message is strictly prohibited. Please delete this email from your system if you are not the intended recipient.

[-- Attachment #2: Type: text/html, Size: 18421 bytes --]

^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2026-03-05 13:53 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-04 18:03 [PATCH] vhost: fix use-after-free in fdset during shutdown Yehor Malikov
2026-02-04 18:48 ` [PATCH v2] " malikovyehor
2026-02-04 18:58   ` [PATCH v3] " Yehor Malikov
2026-02-04 20:34     ` Stephen Hemminger
2026-02-04 21:32     ` Yehor Malikov
2026-02-04 21:35     ` [PATCH v4] " Yehor Malikov
2026-02-04 22:00       ` [PATCH v5] " Yehor Malikov
2026-02-04 23:05         ` [PATCH v6] " Yehor Malikov
2026-02-05  1:17           ` Stephen Hemminger
2026-02-05 11:16           ` [PATCH v7] " Yehor Malikov
2026-02-05 11:20           ` Yehor Malikov
2026-02-05 18:30             ` [PATCH v8] " Yehor Malikov
2026-02-05 18:35               ` [PATCH v9] " Yehor Malikov
2026-02-16 10:17                 ` Yehor Malikov
2026-02-17 14:31                 ` David Marchand
2026-02-18  7:50                   ` [PATCH v10] " Yehor Malikov
2026-02-18  8:01                     ` [PATCH v11] " Yehor Malikov
2026-02-18  8:52                       ` David Marchand
2026-02-18  9:05                         ` [PATCH v12] " Yehor Malikov
2026-02-18 10:27                           ` David Marchand
2026-02-27  9:00                             ` fengchengwen
2026-03-05 10:50                           ` Maxime Coquelin
2026-03-05 13:52                             ` Maxime Coquelin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox