From 0948a781fce19a032b71e65239d6bc5d10c97522 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 12 Feb 2020 10:15:34 +0100 Subject: [PATCH] BUG/MINOR: listener: enforce all_threads_mask on bind_thread on init When intializing a listener, let's make sure the bind_thread mask is always limited to all_threads_mask when inserting the FD. This will avoid seeing listening FDs with bits corresponding to threads that are not active (e.g. when using "bind ... process 1/even"). The side effect is very limited, all that was identified is that atomic operations are used in fd_update_events() when not necessary. It's more a matter of long-term correctness in practice. This fix might be backported as far as 1.8 (then proto_sockpair must be dropped). --- src/proto_sockpair.c | 2 +- src/proto_tcp.c | 2 +- src/proto_uxst.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/proto_sockpair.c b/src/proto_sockpair.c index a6005ee5b..bdc7ebee0 100644 --- a/src/proto_sockpair.c +++ b/src/proto_sockpair.c @@ -158,7 +158,7 @@ static int sockpair_bind_listener(struct listener *listener, char *errmsg, int e listener->state = LI_LISTEN; fd_insert(fd, listener, listener->proto->accept, - thread_mask(listener->bind_conf->bind_thread)); + thread_mask(listener->bind_conf->bind_thread) & all_threads_mask); return err; diff --git a/src/proto_tcp.c b/src/proto_tcp.c index df4e5a4d2..197cb432b 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -999,7 +999,7 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) listener->state = LI_LISTEN; fd_insert(fd, listener, listener->proto->accept, - thread_mask(listener->bind_conf->bind_thread)); + thread_mask(listener->bind_conf->bind_thread) & all_threads_mask); tcp_return: if (msg && errlen) { diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 2a5e4319d..61c89d545 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -343,7 +343,7 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle listener->state = LI_LISTEN; fd_insert(fd, listener, listener->proto->accept, - thread_mask(listener->bind_conf->bind_thread)); + thread_mask(listener->bind_conf->bind_thread) & all_threads_mask); return err;