diff options
Diffstat (limited to 'src/regex')
| -rw-r--r-- | src/regex/fnmatch.c | 15 | 
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) | 
