about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOndřej Bílka <neleai@seznam.cz>2013-10-20 10:00:31 +0200
committerOndřej Bílka <neleai@seznam.cz>2013-10-20 10:03:19 +0200
commita471e96a5352a5f0bde6d32dd36d33524811a2b1 (patch)
tree8af3c2f96199cdad14dc7e9b2a1edefbf2b6dfba
parent45c30c61c9001867c1891f5862764f084e53f348 (diff)
downloadglibc-a471e96a5352a5f0bde6d32dd36d33524811a2b1.tar.gz
glibc-a471e96a5352a5f0bde6d32dd36d33524811a2b1.tar.xz
glibc-a471e96a5352a5f0bde6d32dd36d33524811a2b1.zip
When glob pattern contains a trailing slash match only directories. Fixes bug 10278.
-rw-r--r--ChangeLog7
-rw-r--r--NEWS14
-rw-r--r--posix/glob.c5
-rw-r--r--posix/tst-gnuglob.c10
4 files changed, 27 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f2d833885..0cb5ada9d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2013-10-19  Ondřej Bílka  <neleai@seznam.cz>
 
+	BZ #10278]
+	* posix/glob.c: Match only directories when trailing slash is present.
+	* posix/tst-gnuglob.c (my_opendir): Do not open files.
+	(main): Add testcase.
+
+2013-10-19  Ondřej Bílka  <neleai@seznam.cz>
+
 	[BZ #15670]
 	* time/tzfile.c (__tzfile_read): Replace alloca with malloc.
 
diff --git a/NEWS b/NEWS
index 93f884db7b..f19c4d5db1 100644
--- a/NEWS
+++ b/NEWS
@@ -9,13 +9,13 @@ Version 2.19
 
 * The following bugs are resolved with this release:
 
-  156, 431, 832, 13028, 13982, 13985, 14155, 14547, 14699, 14910, 15048,
-  15218, 15277, 15308, 15362, 15400, 15427, 15522, 15531, 15532, 15608,
-  15609, 15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734,
-  15735, 15736, 15748, 15749, 15754, 15760, 15764, 15797, 15844, 15847,
-  15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892,
-  15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15948,
-  15963, 15966, 15988, 16032, 16034, 16036, 16041.
+  156, 431, 832, 10278, 13028, 13982, 13985, 14155, 14547, 14699, 14910,
+  15048, 15218, 15277, 15308, 15362, 15400, 15427, 15522, 15531, 15532,
+  15608, 15609, 15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723,
+  15734, 15735, 15736, 15748, 15749, 15754, 15760, 15764, 15797, 15844,
+  15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890,
+  15892, 15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939,
+  15948, 15963, 15966, 15988, 16032, 16034, 16036, 16041.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
diff --git a/posix/glob.c b/posix/glob.c
index ece71c168f..85237c2a44 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -276,6 +276,11 @@ glob (pattern, flags, errfunc, pglob)
       return -1;
     }
 
+  /* POSIX requires all slashes to be matched.  This means that with
+     a trailing slash we must match only directories.  */
+  if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
+    flags |= GLOB_ONLYDIR;
+
   if (!(flags & GLOB_DOOFFS))
     /* Have to do this so `globfree' knows where to start freeing.  It
        also makes all the code that uses gl_offs simpler. */
diff --git a/posix/tst-gnuglob.c b/posix/tst-gnuglob.c
index 0c967d0a7a..6e42724d08 100644
--- a/posix/tst-gnuglob.c
+++ b/posix/tst-gnuglob.c
@@ -168,7 +168,7 @@ my_opendir (const char *s)
   my_DIR *dir;
 
 
-  if (idx == -1)
+  if (idx == -1 || filesystem[idx].type != DT_DIR)
     {
       PRINTF ("my_opendir(\"%s\") == NULL\n", s);
       return NULL;
@@ -358,7 +358,7 @@ test_result (const char *fmt, int flags, glob_t *gl, const char *str[])
 	      break;
 
 	  if (str[inner] == NULL)
-	    errstr =  ok ? "" : " *** WRONG";
+	    errstr = ok ? "" : " *** WRONG";
 	  else
 	    errstr = ok ? "" : " * wrong position";
 
@@ -483,6 +483,12 @@ main (void)
 	"/file1lev1",
 	"/file2lev1");
 
+  test ("*/*/", 0 , 0,
+	"dir1lev1/dir1lev2/",
+	"dir1lev1/dir2lev2/",
+	"dir1lev1/dir3lev2/",
+	"dir2lev1/dir1lev2/");
+
   test ("", 0, GLOB_NOMATCH, NULL);
 
   test ("", GLOB_NOCHECK, 0, "");