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.
This commit is contained in:
Willy Tarreau 2020-11-04 13:54:00 +01:00
parent dfe79251da
commit 38dba27d4d

View File

@ -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.
*/