From c22580c2cce86473221f58cf11db19056a5f2f7c Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Mon, 5 Aug 2019 18:51:52 +0200 Subject: [PATCH] BUG/MEDIUM: fd: Always reset the polled_mask bits in fd_dodelete(). In fd_dodelete(), always reset the polled_mask bits, instead on only doing it if we're closing the file descriptor. We call the poller clo() method anyway, and failing to do so means that if fd_remove() is used while the fd is polled, the poller won't attempt to poll on a fd with the same value as the old one. This leads to fd being stuck in the SSL code while using the async engine. This should be backported to 2.0, 1.9 and 1.8. --- src/fd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fd.c b/src/fd.c index a1a457802..c4155aa86 100644 --- a/src/fd.c +++ b/src/fd.c @@ -330,6 +330,7 @@ static void fd_dodelete(int fd, int do_close) } if (cur_poller.clo) cur_poller.clo(fd); + polled_mask[fd].poll_recv = polled_mask[fd].poll_send = 0; fdtab[fd].state = 0; @@ -338,7 +339,6 @@ static void fd_dodelete(int fd, int do_close) fdtab[fd].owner = NULL; fdtab[fd].thread_mask = 0; if (do_close) { - polled_mask[fd].poll_recv = polled_mask[fd].poll_send = 0; close(fd); _HA_ATOMIC_SUB(&ha_used_fds, 1); } -- 2.47.3