From: Ondřej Bílka Date: Sun, 20 Oct 2013 08:00:31 +0000 (+0200) Subject: When glob pattern contains a trailing slash match only directories. Fixes bug 10278. X-Git-Tag: glibc-2.19~583 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=a471e96a5352a5f0bde6d32dd36d33524811a2b1;p=glibc.git When glob pattern contains a trailing slash match only directories. Fixes bug 10278. --- diff --git a/ChangeLog b/ChangeLog index 1f2d833885..0cb5ada9d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-10-19 Ondřej Bílka + + 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 [BZ #15670] 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, "");