about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/regex/fnmatch.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/regex/fnmatch.c b/src/regex/fnmatch.c
index c0856f99..81f0c7bd 100644
--- a/src/regex/fnmatch.c
+++ b/src/regex/fnmatch.c
@@ -53,6 +53,7 @@ int fnmatch(const char *p, const char *s, int flags)
 	int first;
 	int no_slash = (flags & FNM_PATHNAME) ? '/' : 0;
 	int no_period = (flags & FNM_PERIOD) && !(flags & __FNM_CONT) ? '.' : 0x100;
+	const char *p1;
 
 	flags |= __FNM_CONT;
 
@@ -84,6 +85,7 @@ int fnmatch(const char *p, const char *s, int flags)
 					break;
 			return FNM_NOMATCH;
 		case '[':
+			p1 = p-1;
 			not = (*p == '!' || *p == '^');
 			if (not) p++;
 			k = next(&s);
@@ -92,7 +94,7 @@ int fnmatch(const char *p, const char *s, int flags)
 			match = 0;
 			first = 1;
 			for (;;) {
-				if (!*p) return FNM_NOMATCH;
+				if (!*p) goto literal_bracket;
 				if (*p == ']' && !first) break;
 				first = 0;
 				if (*p == '[' && *(p+1) == ':') {
@@ -112,15 +114,20 @@ int fnmatch(const char *p, const char *s, int flags)
 					continue;
 				}
 				c = bracket_next(&p);
-				if (c == BRACKET_ERROR)
-					return FNM_NOMATCH;
+				if (c == BRACKET_ERROR) {
+literal_bracket:
+					match = (k=='[');
+					p = p1;
+					not = 0;
+					break;
+				}
 				if (c == BRACKET_NOCHAR)
 					continue;
 				if (*p == '-' && *(p+1) != ']') {
 					p++;
 					d = bracket_next(&p);
 					if (d == BRACKET_ERROR)
-						return FNM_NOMATCH;
+						goto literal_bracket;
 					if (d == BRACKET_NOCHAR)
 						continue;
 					if (k >= c && k <= d)