From: Willy Tarreau Date: Mon, 6 Feb 2023 17:01:50 +0000 (+0100) Subject: BUG/MEDIUM: thread: fix extraneous shift in the thread_set parser X-Git-Tag: v2.8-dev4~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f91ab7a08c5ef54b4c268373e250abdae0820960;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: thread: fix extraneous shift in the thread_set parser 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"). --- diff --git a/src/thread.c b/src/thread.c index 489c841645..95d979bb19 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 */,