From 698342635491a30b219bebeb1bbe7877efdbe3b6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 25 Jul 2022 15:39:21 +0200 Subject: [PATCH] BUG/MAJOR: poller: drop FD's tgid when masks don't match A bug was introduced in 2.7-dev2 by commit 1f947cb39 ("MAJOR: poller: only touch/inspect the update_mask under tgid protection"): once the FD's tgid is held, we would forget to drop it in case the update mask doesn't match, resulting in random watchdog panics of older processes on successive reloads. This should fix issue #1798. Thanks to Christian for the report and to Christopher for the reproducer. No backport is needed. --- src/ev_epoll.c | 4 +++- src/ev_evports.c | 4 +++- src/ev_kqueue.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ev_epoll.c b/src/ev_epoll.c index f35e1c29b..970c0fe70 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -204,8 +204,10 @@ static void _do_poll(struct poller *p, int exp, int wake) continue; } - if (!(fdtab[fd].update_mask & ti->ltid_bit)) + if (!(fdtab[fd].update_mask & ti->ltid_bit)) { + fd_drop_tgid(fd); continue; + } done_update_polling(fd); diff --git a/src/ev_evports.c b/src/ev_evports.c index 19d572c66..2530b39c0 100644 --- a/src/ev_evports.c +++ b/src/ev_evports.c @@ -160,8 +160,10 @@ static void _do_poll(struct poller *p, int exp, int wake) continue; } - if (!(fdtab[fd].update_mask & ti->ltid_bit)) + if (!(fdtab[fd].update_mask & ti->ltid_bit)) { + fd_drop_tgid(fd); continue; + } done_update_polling(fd); diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index 3d555ec7e..3c8787ffd 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -134,8 +134,10 @@ static void _do_poll(struct poller *p, int exp, int wake) continue; } - if (!(fdtab[fd].update_mask & ti->ltid_bit)) + if (!(fdtab[fd].update_mask & ti->ltid_bit)) { + fd_drop_tgid(fd); continue; + } done_update_polling(fd);