aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-01-14 08:06:22 -0500
committerUlrich Drepper <drepper@gmail.com>2011-01-14 08:06:22 -0500
commit794c3ad3a405697e2663b00f616e319383b9bb7d (patch)
treeeabcf25257fdcc1e98cc3a9bf6a5333cba3dfb3c
parent68dc949774cb651d53541df4abdc60327f7e096b (diff)
downloadglibc-794c3ad3a405697e2663b00f616e319383b9bb7d.tar
glibc-794c3ad3a405697e2663b00f616e319383b9bb7d.tar.gz
glibc-794c3ad3a405697e2663b00f616e319383b9bb7d.tar.bz2
glibc-794c3ad3a405697e2663b00f616e319383b9bb7d.zip
FIx handling of unterminated [ expression in fnmatch.
-rw-r--r--ChangeLog11
-rw-r--r--NEWS4
-rw-r--r--posix/fnmatch_loop.c13
-rwxr-xr-xposix/globtest.sh13
-rw-r--r--posix/testfnm.c2
-rw-r--r--posix/tst-fnmatch.input11
-rw-r--r--posix/tst-fnmatch2.c5
7 files changed, 43 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ca8b79b79..59d1a94803 100644
--- 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 dd212d6ee4..5e5b7aa365 100644
--- 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
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c
index 6b0224ea2c..5c15f46fd9 100644
--- a/posix/fnmatch_loop.c
+++ b/posix/fnmatch_loop.c
@@ -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;
diff --git a/posix/globtest.sh b/posix/globtest.sh
index aadac87796..9b9021d690 100755
--- a/posix/globtest.sh
+++ b/posix/globtest.sh
@@ -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" \
diff --git a/posix/testfnm.c b/posix/testfnm.c
index f3165324e9..7a04d2a912 100644
--- a/posix/testfnm.c
+++ b/posix/testfnm.c
@@ -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 },
diff --git a/posix/tst-fnmatch.input b/posix/tst-fnmatch.input
index 9061d19945..a799097768 100644
--- a/posix/tst-fnmatch.input
+++ b/posix/tst-fnmatch.input
@@ -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
diff --git a/posix/tst-fnmatch2.c b/posix/tst-fnmatch2.c
index 28a0871c1c..e66a01f592 100644
--- a/posix/tst-fnmatch2.c
+++ b/posix/tst-fnmatch2.c
@@ -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;
}