From 897e2c58e68aab6cc583b8d597d15fd065783592 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 13 Mar 2019 15:03:53 +0100 Subject: [PATCH] BUG/MEDIUM: listener: make sure we don't pick stopped threads Dragan Dosen reported that after the multi-queue changes, appending "process 1/even" on a bind line can make the process immediately crash when delivering a first connection. This is due to the fact that I believed that thread_mask(mask) applied the all_threads_mask value, but it doesn't. And in case of even/odd the bits cover more than the available threads, resulting in too high a thread number being selected and a non-existing task to be woken up. No backport is needed. --- src/listener.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/listener.c b/src/listener.c index 4299761e5b..a023e59167 100644 --- a/src/listener.c +++ b/src/listener.c @@ -845,7 +845,7 @@ void listener_accept(int fd) next_actconn = 0; #if defined(USE_THREAD) - mask = thread_mask(l->bind_conf->bind_thread); + mask = thread_mask(l->bind_conf->bind_thread) & all_threads_mask; if (atleast2(mask) && (global.tune.options & GTUNE_LISTENER_MQ)) { struct accept_queue_ring *ring; unsigned int t, t0, t1, t2;