From: Willy Tarreau Date: Wed, 13 Mar 2019 14:03:53 +0000 (+0100) Subject: BUG/MEDIUM: listener: make sure we don't pick stopped threads X-Git-Tag: v2.0-dev2~66 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=897e2c58e68aab6cc583b8d597d15fd065783592;p=thirdparty%2Fhaproxy.git 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. --- 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;