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.
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
index f35e1c2..970c0fe 100644
--- a/src/ev_epoll.c
+++ b/src/ev_epoll.c
@@ -204,8 +204,10 @@
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 19d572c..2530b39 100644
--- a/src/ev_evports.c
+++ b/src/ev_evports.c
@@ -160,8 +160,10 @@
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 3d555ec..3c8787f 100644
--- a/src/ev_kqueue.c
+++ b/src/ev_kqueue.c
@@ -134,8 +134,10 @@
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);