>From 9aa072b4e5029ec6dc030e2add20855e95182511 Mon Sep 17 00:00:00 2001 From: raf Date: Wed, 8 Oct 2025 12:55:58 +1100 Subject: [PATCH] fnmatch: fix infinite loop when pattern is non-character byte --- src/regex/fnmatch.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/regex/fnmatch.c b/src/regex/fnmatch.c index 978fff88..1bbcf28e 100644 --- a/src/regex/fnmatch.c +++ b/src/regex/fnmatch.c @@ -240,6 +240,8 @@ static int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n p = ptail; for (;;) { c = pat_next(p, endpat-p, &pinc, flags); + if (c == UNMATCHABLE) + return FNM_NOMATCH; p += pinc; if ((k = str_next(s, endstr-s, &sinc)) <= 0) { if (c != END) return FNM_NOMATCH; @@ -265,6 +267,8 @@ static int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n s = str; for (;;) { c = pat_next(p, endpat-p, &pinc, flags); + if (c == UNMATCHABLE) + return FNM_NOMATCH; p += pinc; /* Encountering * completes/commits a component */ if (c == STAR) { @@ -302,7 +306,9 @@ int fnmatch(const char *pat, const char *str, int flags) int c; if (flags & FNM_PATHNAME) for (;;) { for (s=str; *s && *s!='/'; s++); - for (p=pat; (c=pat_next(p, -1, &inc, flags))!=END && c!='/'; p+=inc); + for (p=pat; (c=pat_next(p, -1, &inc, flags))!=END && c!=UNMATCHABLE && c!='/'; p+=inc); + if (c == UNMATCHABLE) + return FNM_NOMATCH; if (c!=*s && (!*s || !(flags & FNM_LEADING_DIR))) return FNM_NOMATCH; if (fnmatch_internal(pat, p-pat, str, s-str, flags)) -- 2.50.0