>From a5a11d58c6e087840a57d321e9083d115c44fe0c Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 5 Oct 2026 19:51:42 -0400 Subject: [PATCH 1/6] fnmatch: restructure match_bracket range handling rather than duplicating the mbtowc logic to process the next character when seeing a '-', keep the character from the last loop iteration to process a range if we find one. --- src/regex/fnmatch.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/regex/fnmatch.c b/src/regex/fnmatch.c index afa46db5..f6f2bf63 100644 --- a/src/regex/fnmatch.c +++ b/src/regex/fnmatch.c @@ -122,16 +122,11 @@ static int match_bracket(const char *p, int k, int kfold) } wc = p[-1]; for (; *p != ']'; p++) { + wchar_t wc0 = wc; + int is_range = 0; if (p[0]=='-' && p[1]!=']') { - wchar_t wc2; - int l = mbtowc(&wc2, ++p, 4); - if (l < 0) return 0; - if (wc <= wc2) - if ((unsigned)k-wc <= wc2-wc || - (unsigned)kfold-wc <= wc2-wc) - return !inv; - p += l-1; - continue; + is_range = 1; + p++; } if (p[0]=='[' && (p[1]==':' || p[1]=='.' || p[1]=='=')) { const char *p0 = p+2; @@ -147,16 +142,20 @@ static int match_bracket(const char *p, int k, int kfold) return !inv; } continue; - } - if (*p < 128U) { + } else if (*p < 128U) { wc = (unsigned char)*p; } else { int l = mbtowc(&wc, p, 4); if (l < 0) return 0; p += l-1; } - if ((wc==k || wc==kfold) && (p[1]!='-' || p[2]==']')) - return !inv; + if (is_range) { + if ((k>=wc0 && k<=wc) || (kfold>=wc0 && kfold<=wc)) + return !inv; + } else if (p[1]!='-' || p[2]==']') { + if (wc==k || wc==kfold) + return !inv; + } } return inv; } -- 2.21.0