]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix read past end of pattern in fnmatch (bug 18032)
authorAndreas Schwab <schwab@suse.de>
Thu, 26 Feb 2015 13:55:24 +0000 (14:55 +0100)
committerMike Frysinger <vapier@gentoo.org>
Tue, 21 Jul 2015 03:24:24 +0000 (23:24 -0400)
(cherry picked from commit 4a28f4d55a6cc33474c0792fe93b5942d81bf185)
(cherry picked from commit fe7b1136e5753c85b3ccc8395dfc66b82052d73c)

posix/fnmatch_loop.c
posix/tst-fnmatch3.c

index c0cb2fc3e6cd5280043207d40a1d8f119ca5d3cf..72c5d8f0413379b0027e9ec6d11ab9c706d6b6ac 100644 (file)
@@ -945,14 +945,13 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
                  }
                else if (c == L('[') && *p == L('.'))
                  {
-                   ++p;
                    while (1)
                      {
                        c = *++p;
-                       if (c == '\0')
+                       if (c == L('\0'))
                          return FNM_NOMATCH;
 
-                       if (*p == L('.') && p[1] == L(']'))
+                       if (c == L('.') && p[1] == L(']'))
                          break;
                      }
                    p += 2;
index d27a557c7cb1d46f02aa09fa900acdf38a32f9f8..75bc00a2c56669b2cc9a1e6f85557513e6685f50 100644 (file)
 int
 do_test (void)
 {
-  const char *pattern = "[[:alpha:]'[:alpha:]\0]";
-
-  return fnmatch (pattern, "a", 0) != FNM_NOMATCH;
+  if (fnmatch ("[[:alpha:]'[:alpha:]\0]", "a", 0) != FNM_NOMATCH)
+    return 1;
+  if (fnmatch ("[a[.\0.]]", "a", 0) != FNM_NOMATCH)
+    return 1;
+  return 0;
 }
 
 #define TEST_FUNCTION do_test ()