diff options
| author | Russell Belfer <rb@github.com> | 2012-10-11 13:39:53 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2012-10-15 12:54:46 -0700 |
| commit | d5a51910678f8aea2b7efe077efc678141762dfc (patch) | |
| tree | 7fa2ed6a8c21a464ce28cb6323c7e36ef47c2131 /src/fnmatch.c | |
| parent | 824d5e4d260fc740dbe9251008439b9e58db5f19 (diff) | |
| download | libgit2-d5a51910678f8aea2b7efe077efc678141762dfc.tar.gz | |
Import DOS fix for fnmatch
Because fnmatch uses recursion, there were some input sequences
that cause seriously degenerate behavior. This imports a fix
that imposes a max recursion limiter to avoid the worst of it.
Diffstat (limited to 'src/fnmatch.c')
| -rw-r--r-- | src/fnmatch.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/fnmatch.c b/src/fnmatch.c index 835d811bc..f394274da 100644 --- a/src/fnmatch.c +++ b/src/fnmatch.c @@ -24,13 +24,16 @@ static int rangematch(const char *, char, int, char **); -int -p_fnmatch(const char *pattern, const char *string, int flags) +static int +p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs) { const char *stringstart; char *newp; char c, test; + if (recurs-- == 0) + return FNM_NORES; + for (stringstart = string;;) switch (c = *pattern++) { case EOS: @@ -75,8 +78,11 @@ p_fnmatch(const char *pattern, const char *string, int flags) /* General case, use recursion. */ while ((test = *string) != EOS) { - if (!p_fnmatch(pattern, string, flags & ~FNM_PERIOD)) - return (0); + int e; + + e = p_fnmatchx(pattern, string, flags & ~FNM_PERIOD, recurs); + if (e != FNM_NOMATCH) + return e; if (test == '/' && (flags & FNM_PATHNAME)) break; ++string; @@ -178,3 +184,9 @@ rangematch(const char *pattern, char test, int flags, char **newp) return (ok == negate ? RANGE_NOMATCH : RANGE_MATCH); } +int +p_fnmatch(const char *pattern, const char *string, int flags) +{ + return p_fnmatchx(pattern, string, flags, 64); +} + |
