From: Willy Tarreau Date: Wed, 4 Nov 2020 12:54:00 +0000 (+0100) Subject: BUG/MEDIUM: listener: only enable a listening listener if needed X-Git-Tag: v2.3.0~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=38dba27d4d2b3a39bb88893023c5269a871b52f2;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: listener: only enable a listening listener if needed The test on listener->state == LI_LISTEN is not sufficient to decide if we need to enable a listener. Indeed, there is a very special case which is the inherited FD shared, which has to reflect the real socket state even after the previous test, and as such needs to remain in LI_LISTEN state. In this case we don't want a worker to start the master's listener nor conversely. Let's add a specific test for this. --- diff --git a/src/listener.c b/src/listener.c index 1947fdb538..7f038c4a3d 100644 --- a/src/listener.c +++ b/src/listener.c @@ -257,7 +257,8 @@ void enable_listener(struct listener *listener) if (listener->state == LI_LISTEN) { BUG_ON(listener->rx.fd == -1); if ((global.mode & (MODE_DAEMON | MODE_MWORKER)) && - !(proc_mask(listener->rx.settings->bind_proc) & pid_bit)) { + (!!master != !!(listener->rx.flags & RX_F_MWORKER) || + !(proc_mask(listener->rx.settings->bind_proc) & pid_bit))) { /* we don't want to enable this listener and don't * want any fd event to reach it. */