[PATCH v3 1/8] lib/glob: normalize inverted character class ranges

From: Josh Law

Date: Sun Mar 15 2026 - 17:17:20 EST


When a character class range has its endpoints reversed (e.g., [z-a]),
the comparison a <= c && c <= b can never be true, so the range
silently matches nothing. A pattern like "file[9-0]" intended to
match any digit would fail to match anything, with no indication
that the range is backwards.

Swap the endpoints when a > b so that inverted ranges behave the
same as their forward equivalents: [z-a] matches the same characters
as [a-z], and [9-0] matches the same as [0-9]. This is consistent
with how GNU fnmatch and other glob implementations handle reversed
ranges.

Signed-off-by: Josh Law <objecting@xxxxxxxxxxxxx>
---
lib/glob.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/lib/glob.c b/lib/glob.c
index 7aca76c25bcb..cb45a9a47f28 100644
--- a/lib/glob.c
+++ b/lib/glob.c
@@ -94,7 +94,13 @@ bool __pure glob_match(char const *pat, char const *str)
goto literal;

class += 2;
- /* Any special action if a > b? */
+ /* Normalize inverted ranges like [z-a] */
+ if (a > b) {
+ unsigned char tmp = a;
+
+ a = b;
+ b = tmp;
+ }
}
if (a <= c && c <= b)
match = true;
--
2.34.1