]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: fd: Always reset the polled_mask bits in fd_dodelete().
authorOlivier Houchard <ohouchard@haproxy.com>
Mon, 5 Aug 2019 16:51:52 +0000 (18:51 +0200)
committerOlivier Houchard <cognet@ci0.org>
Mon, 5 Aug 2019 16:55:04 +0000 (18:55 +0200)
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

index a1a457802ee01e2175d1d9e9bd61e5d61a4f56e4..c4155aa86fc9153fff81d14f7fc25924e8970e65 100644 (file)
--- 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);
        }