From f91ab7a08c5ef54b4c268373e250abdae0820960 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 6 Feb 2023 18:01:50 +0100 Subject: [PATCH] BUG/MEDIUM: thread: fix extraneous shift in the thread_set parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aurélien reported a bug making a statement such as "thread 2-2" fail for a config made of exactly 2 threads. What happens is that the parser for the "thread" keyword scans a range of thread numbers from either 1..64 or 0,-1,-2 for special values, and presets the bit masks accordingly in the thread set, except that due to the 1..64 range, the shift length must be reduced by one. Not doing this causes empty masks for single-bit values that are exactly equal to the number of threads in the group and fails to properly parse. No backport is needed as this was introduced in 2.8-dev3 by commit bef43dfa6 ("MINOR: thread: add a simple thread_set API"). --- src/thread.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/thread.c b/src/thread.c index 489c84164..95d979bb1 100644 --- a/src/thread.c +++ b/src/thread.c @@ -1522,7 +1522,7 @@ int parse_thread_set(const char *arg, struct thread_set *ts, char **err) if (max >= min) { for (v = min; v <= max; v++) - ts->rel[tg - 1] |= 1UL << v; + ts->rel[tg - 1] |= 1UL << (v - 1); } else { memset(&ts->rel[tg - 1], (max == 0) ? 0xff /* all */ : (max == -1) ? 0x55 /* odd */: 0xaa /* even */, @@ -1532,7 +1532,7 @@ int parse_thread_set(const char *arg, struct thread_set *ts, char **err) /* absolute thread numbers */ if (max >= min) { for (v = min; v <= max; v++) - ts->abs[v / LONGBITS] |= 1UL << (v % LONGBITS); + ts->abs[(v - 1) / LONGBITS] |= 1UL << ((v - 1) % LONGBITS); } else { memset(&ts->abs, (max == 0) ? 0xff /* all */ : (max == -1) ? 0x55 /* odd */: 0xaa /* even */,