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