1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-23 08:38:49 -05:00

fnmatch: optimize processing of consecutive *s and ?s pattern characters

Reported-By: Daniel Stenberg
Fixes #2291
Closes #2293
This commit is contained in:
Patrick Monnerat 2018-02-07 15:01:51 +01:00
parent ff07089585
commit a0984eae14

View File

@ -256,7 +256,6 @@ static int loop(const unsigned char *pattern, const unsigned char *string,
unsigned char *p = (unsigned char *)pattern;
unsigned char *s = (unsigned char *)string;
unsigned char charset[CURLFNM_CHSET_SIZE] = { 0 };
int rc = 0;
for(;;) {
unsigned char *pp;
@ -265,18 +264,24 @@ static int loop(const unsigned char *pattern, const unsigned char *string,
case '*':
if(!maxstars)
return CURL_FNMATCH_NOMATCH;
while(p[1] == '*') /* eliminate multiple stars */
p++;
if(*s == '\0' && p[1] == '\0')
return CURL_FNMATCH_MATCH;
rc = loop(p + 1, s, maxstars - 1); /* *.txt matches .txt <=>
.txt matches .txt */
if(rc == CURL_FNMATCH_MATCH)
return CURL_FNMATCH_MATCH;
if(!*s)
return CURL_FNMATCH_NOMATCH;
s++; /* let the star eat up one character */
break;
/* Regroup consecutive stars and question marks. This can be done because
'*?*?*' can be expressed as '??*'. */
for(;;) {
if(*++p == '\0')
return CURL_FNMATCH_MATCH;
if(*p == '?') {
if(!*s++)
return CURL_FNMATCH_NOMATCH;
}
else if(*p != '*')
break;
}
/* Skip string characters until we find a match with pattern suffix. */
for(maxstars--; *s; s++) {
if(loop(p, s, maxstars) == CURL_FNMATCH_MATCH)
return CURL_FNMATCH_MATCH;
}
return CURL_FNMATCH_NOMATCH;
case '?':
if(!*s)
return CURL_FNMATCH_NOMATCH;