That patch seems to have gotten munged and there was a duplicate
return statement.  This one works for me.

 - todd

Index: lib/libc/gen/glob.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/glob.c,v
retrieving revision 1.46
diff -u -p -u -r1.46 glob.c
--- lib/libc/gen/glob.c 28 Dec 2015 22:08:18 -0000      1.46
+++ lib/libc/gen/glob.c 28 Apr 2017 16:57:17 -0000
@@ -126,9 +126,6 @@ typedef char Char;
 #define        GLOB_LIMIT_STAT         2048
 #define        GLOB_LIMIT_READDIR      16384
 
-/* Limit of recursion during matching attempts. */
-#define GLOB_LIMIT_RECUR       64
-
 struct glob_lim {
        size_t  glim_malloc;
        size_t  glim_stat;
@@ -161,7 +158,7 @@ static const Char *
 static int      globexp1(const Char *, glob_t *, struct glob_lim *);
 static int      globexp2(const Char *, const Char *, glob_t *,
                    struct glob_lim *);
-static int      match(Char *, Char *, Char *, int);
+static int      match(Char *, Char *, Char *);
 #ifdef DEBUG
 static void     qprintf(const char *, Char *);
 #endif
@@ -753,7 +750,7 @@ glob3(Char *pathbuf, Char *pathbuf_last,
                        break;
                }
 
-               if (!match(pathend, pattern, restpattern, GLOB_LIMIT_RECUR)) {
+               if (!match(pathend, pattern, restpattern)) {
                        *pathend = EOS;
                        continue;
                }
@@ -883,17 +880,24 @@ globextend(const Char *path, glob_t *pgl
 
 /*
  * pattern matching function for filenames.  Each occurrence of the *
- * pattern causes a recursion level.
+ * pattern causes an iteration.
+ *
+ * Note, this function differs from the original as per the discussion
+ * here: https://research.swtch.com/glob
+ *
+ * Basically we removed the recursion and made it use the algorithm
+ * from Russ Cox to not go quadratic on cases like a file called
+ * ("a" x 100) . "x" matched against a pattern like "a*a*a*a*a*a*a*y".
  */
 static int
-match(Char *name, Char *pat, Char *patend, int recur)
+match(Char *name, Char *pat, Char *patend)
 {
        int ok, negate_range;
        Char c, k;
+       Char *nextp = NULL;
+       Char *nextn = NULL;
 
-       if (recur-- == 0)
-               return(GLOB_NOSPACE);
-
+loop:
        while (pat < patend) {
                c = *pat++;
                switch (c & M_MASK) {
@@ -902,19 +906,19 @@ match(Char *name, Char *pat, Char *paten
                                pat++;  /* eat consecutive '*' */
                        if (pat == patend)
                                return(1);
-                       do {
-                           if (match(name, pat, patend, recur))
-                                   return(1);
-                       } while (*name++ != EOS);
-                       return(0);
+                       if (*name == EOS)
+                               return(0);
+                       nextn = name + 1;
+                       nextp = pat - 1;
+                       break;
                case M_ONE:
                        if (*name++ == EOS)
-                               return(0);
+                               goto fail;
                        break;
                case M_SET:
                        ok = 0;
                        if ((k = *name++) == EOS)
-                               return(0);
+                               goto fail;
                        if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)
                                ++pat;
                        while (((c = *pat++) & M_MASK) != M_END) {
@@ -933,15 +937,24 @@ match(Char *name, Char *pat, Char *paten
                                        ok = 1;
                        }
                        if (ok == negate_range)
-                               return(0);
+                               goto fail;
                        break;
                default:
                        if (*name++ != c)
-                               return(0);
+                               goto fail;
                        break;
                }
        }
-       return(*name == EOS);
+       if (*name == EOS)
+               return(1);
+
+fail:
+       if (nextn) {
+               pat = nextp;
+               name = nextn;
+               goto loop;
+       }
+       return(0);
 }
 
 /* Free allocated data belonging to a glob_t structure. */

Reply via email to