]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
FIx handling of unterminated [ expression in fnmatch.
authorUlrich Drepper <drepper@gmail.com>
Fri, 14 Jan 2011 13:06:22 +0000 (08:06 -0500)
committerUlrich Drepper <drepper@gmail.com>
Fri, 14 Jan 2011 13:06:22 +0000 (08:06 -0500)
ChangeLog
NEWS
posix/fnmatch_loop.c
posix/globtest.sh
posix/testfnm.c
posix/tst-fnmatch.input
posix/tst-fnmatch2.c

index 9ca8b79b79ce7cd1d36a6bfbe2f0dd31dcca578c..59d1a94803d8c7a557de6b5834f60cee670b6f5a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2011-01-14  Ulrich Drepper  <drepper@gmail.com>
+
+       [BZ #12378]
+       * posix/fnmatch_loop.c (FCT): When matching '[' keep track of beginning
+       and fall back to matching as normal character if the string ends before
+       the matching ']' is found.  This is what POSIX requires.
+       * posix/testfnm.c: Adjust test result.
+       * posix/globtest.sh: Adjust test result.  Add new test.
+       * posix/tst-fnmatch.input: Likewise.
+       * posix/tst-fnmatch2.c: Add new test.
+
 2010-12-28  Andreas Schwab  <schwab@linux-m68k.org>
 
        * elf/Makefile (check-execstack): Revert last change.  Depend on
diff --git a/NEWS b/NEWS
index dd212d6ee426297893aa98e47e96cbdf830c1140..5e5b7aa3659e5452d3e70f7be1e0422b5943c5a4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-1-13
+GNU C Library NEWS -- history of user-visible changes.  2011-1-14
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -12,7 +12,7 @@ Version 2.13
   3268, 7066, 10085, 10484, 10851, 11149, 11155, 11611, 11640, 11655, 11701,
   11840, 11856, 11883, 11903, 11904, 11968, 11979, 12005, 12037, 12067,
   12077, 12078, 12092, 12093, 12107, 12108, 12113, 12140, 12159, 12167,
-  12191, 12194, 12201, 12204, 12205, 12207, 12348, 12394, 12397
+  12191, 12194, 12201, 12204, 12205, 12207, 12348, 12378, 12394, 12397
 
 * New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark
 
index 6b0224ea2c86d8c6114787ebbea36373c5ef769c..5c15f46fd96a0b4a6a7d046d20c2f5a9bb41658a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007,2010
+/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007,2010,2011
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -235,6 +235,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
        case L('['):
          {
            /* Nonzero if the sense of the character class is inverted.  */
+           CHAR *p_init = p;
+           CHAR *n_init = n;
            register int not;
            CHAR cold;
            UCHAR fn;
@@ -445,8 +447,13 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
                  }
 #endif
                else if (c == L('\0'))
-                 /* [ (unterminated) loses.  */
-                 return FNM_NOMATCH;
+                 {
+                   /* [ unterminated, treat as normal character.  */
+                   p = p_init;
+                   n = n_init;
+                   c = L('[');
+                   goto normal_match;
+                 }
                else
                  {
                    int is_range = 0;
index aadac877964d7c59d8c8c6d8356d8ccc0bd3cc73..9b9021d6904cdf517779f14752abb3d1ed73c74b 100755 (executable)
@@ -722,21 +722,24 @@ ${elf_objpfx}${rtld_installed_name} --library-path ${library_path} \
 ${common_objpfx}posix/globtest -c "$testdir" \
 'dir3\*/file1' 'dir3\*/file2' 'dir1/file\1_1' 'dir1/file\1_9' \
 'dir2\/' 'nondir\/' 'dir4[a/fil*1' 'di*r4[a/file2' 'dir5[ab]/file[12]' \
-'dir6/fil*[a' 'dir*6/file1[a' 'dir6/fi*l[ab]' 'dir*6/file1[ab]' |
+'dir6/fil*[a' 'dir*6/file1[a' 'dir6/fi*l[ab]' 'dir*6/file1[ab]' \
+'dir6/file1[[.a.]*' |
 sort > $testout
 cat <<"EOF" | $CMP - $testout >> $logfile || failed=1
-`di*r4[a/file2'
-`dir*6/file1[a'
 `dir*6/file1[ab]'
 `dir1/file1_1'
 `dir1/file\1_9'
 `dir2/'
 `dir3*/file1'
 `dir3\*/file2'
-`dir4[a/fil*1'
+`dir4[a/file1'
+`dir4[a/file2'
 `dir5[ab]/file[12]'
 `dir6/fi*l[ab]'
-`dir6/fil*[a'
+`dir6/file1[a'
+`dir6/file1[a'
+`dir6/file1[a'
+`dir6/file1[ab]'
 `nondir\/'
 EOF
 HOME="$testdir" \
index f3165324e922479f6ac4185aa693a79aabdeff8b..7a04d2a91289f8e16b0a93b08be96f6f34e6dc13 100644 (file)
@@ -26,7 +26,7 @@ struct {
   { "*/b", "\\*/b", 0, 0 },
   { "a/b", "\\?/b", 0, FNM_NOMATCH },
   { "?/b", "\\?/b", 0, 0 },
-  { "[/b", "[/b", 0, FNM_NOMATCH },
+  { "[/b", "[/b", 0, 0 },
   { "[/b", "\\[/b", 0, 0 },
   { "aa/b", "?""?/b", 0, 0 },
   { "aa/b", "?""?""?b", 0, 0 },
index 9061d199456081271ce09ae0ccd5d977cf618fed..a79909776880f77d41094cca3f081e7c183f2a8d 100644 (file)
@@ -1,5 +1,5 @@
 # Tests for fnmatch.
-# Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2001, 2004, 2011 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 # Contributes by Ulrich Drepper <drepper@redhat.com>.
 #
@@ -65,10 +65,10 @@ C            "a"                    "[!abc]"               NOMATCH
 C               "]"                    "[][abc]"              0
 C               "abc]"                 "[][abc]"              NOMATCH
 C               "[]abc"                "[][]abc"              NOMATCH
-C               "]"                    "[!]]"                 NOMATCH
+C               "]"                    "[!]]"                 NOMATCH
 C               "aa]"                  "[!]a]"                NOMATCH
-C               "]"                    "[!a]"                 0
-C               "]]"                   "[!a]]"                0
+C               "]"                    "[!a]"                 0
+C               "]]"                   "[!a]]"                0
 
 # B.6 012(C)
 C               "a"                    "[[.a.]]"              0
@@ -340,7 +340,8 @@ C            "/.a/.b"               "/*b"                  NOMATCH PATHNAME
 # B.6 031(C)
 C               "/$"                   "\\/\\$"               0
 C               "/["                   "\\/\\["               0
-C               "/["                   "\\/["                 NOMATCH
+C               "/["                   "\\/["                 0
+C               "/[]"                  "\\/\\[]"              0
 
 # B.6 032(C)
 C               "/$"                   "\\/\\$"               NOMATCH NOESCAPE
index 28a0871c1c6d8cafefb8953ade247580baf32710..e66a01f5926851a6a04101322fc5037b8527a1a1 100644 (file)
@@ -28,6 +28,11 @@ do_test (void)
       puts ("Fourth fnmatch didn't return 0");
       return 1;
     }
+  if (fnmatch ("[", "[", 0) != 0)
+    {
+      puts ("Fifth fnmatch didn't return 0");
+      return 1;
+    }
   return 0;
 }