+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
-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.
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
-/* 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.
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;
}
#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;
${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" \
{ "*/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 },
# 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>.
#
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
# B.6 031(C)
C "/$" "\\/\\$" 0
C "/[" "\\/\\[" 0
-C "/[" "\\/[" NOMATCH
+C "/[" "\\/[" 0
+C "/[]" "\\/\\[]" 0
# B.6 032(C)
C "/$" "\\/\\$" NOMATCH NOESCAPE
puts ("Fourth fnmatch didn't return 0");
return 1;
}
+ if (fnmatch ("[", "[", 0) != 0)
+ {
+ puts ("Fifth fnmatch didn't return 0");
+ return 1;
+ }
return 0;
}