summaryrefslogtreecommitdiff
path: root/src/fnmatch.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-10-11 13:39:53 -0700
committerRussell Belfer <rb@github.com>2012-10-15 12:54:46 -0700
commitd5a51910678f8aea2b7efe077efc678141762dfc (patch)
tree7fa2ed6a8c21a464ce28cb6323c7e36ef47c2131 /src/fnmatch.c
parent824d5e4d260fc740dbe9251008439b9e58db5f19 (diff)
downloadlibgit2-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.c20
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);
+}
+