diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-07-26 16:09:26 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-07-26 17:09:31 -0300 |
commit | 80aed7ed5a919358c0bce9bfee97c4d8ac533d5e (patch) | |
tree | a3a2d2c98ae9c11dcbc5f15f92888510cc3ea0ab | |
parent | c50dfe79df1b3a3fe3ba3bc1eba3c354a5d122a6 (diff) | |
download | glibc-azanella/glob-fixes.tar.gz |
posix: Fix glob with GLOB_NOCHECK returning modified patterns (BZ#10246)azanella/glob-fixes
Acconding to POSIX glob with GLOB_NOCHECK should return a list consisting
of only of the input pattern in case of no match. However GLIBC does not
honor in case of '//<something'. This is due internally this is handled
and special case and prefix_array (responsable to prepend the directory
name) does not know if the input already contains a slash or not since
either '/<something>' or '//<something>' will be handle in same way.
This patch fix it by using a empty directory name for the latter (since
prefix_array already adds a slash as default for each entry).
Checked on x86_64-linux-gnu.
[BZ #10246]
* posix/glob.c (glob): Handle pattern that do not match and
start with '/' correctly.
* posix/globtest.sh: New tests for NOCHECK.
-rw-r--r-- | posix/glob.c | 14 | ||||
-rwxr-xr-x | posix/globtest.sh | 36 |
2 files changed, 44 insertions, 6 deletions
diff --git a/posix/glob.c b/posix/glob.c index e94d0f7623..744bcceb01 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -357,6 +357,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), size_t oldcount; int meta; bool dirname_modified; + /* Indicate if the directory should be prepended on return values. */ + bool dirname_prefix = true; glob_t dirs; int retval = 0; struct char_array dirname; @@ -590,6 +592,10 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), goto err_nospace; dirlen = 1; ++filename; + /* prefix_array adds a separator for each result and DIRNAME is + already '/'. So we indicate later that we should not prepend + anything for this specific case. */ + dirname_prefix = false; } else { @@ -1099,7 +1105,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), if (dirlen > 0) { /* Stick the directory on the front of each name. */ - if (prefix_array (char_array_str (&dirname), + if (prefix_array (dirname_prefix ? char_array_str (&dirname) : "", &pglob->gl_pathv[old_pathc + pglob->gl_offs], pglob->gl_pathc - old_pathc)) { @@ -1196,12 +1202,8 @@ prefix_array (const char *dirname, char **array, size_t n) # define DIRSEP_CHAR '/' #endif - if (dirlen == 1 && dirname[0] == '/') - /* DIRNAME is just "/", so normal prepending would get us "//foo". - We want "/foo" instead, so don't prepend any chars from DIRNAME. */ - dirlen = 0; #if defined __MSDOS__ || defined WINDOWS32 - else if (dirlen > 1) + if (dirlen > 1) { if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':') /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */ diff --git a/posix/globtest.sh b/posix/globtest.sh index 73f7ae31cc..938bc47ff5 100755 --- a/posix/globtest.sh +++ b/posix/globtest.sh @@ -242,6 +242,42 @@ if test $failed -ne 0; then result=1 fi +# Test NOCHECK for specific cases where the pattern used starts +# with '/' (BZ#10246). +failed=0 +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "/%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`/%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "//%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`//%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "///%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`///%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + # Test NOMAGIC without magic characters failed=0 ${test_program_prefix} \ |