From ad492ca9327fc9f7f0ea7a0ddd32e62cdf0c9137 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 19 Aug 2013 14:21:16 +0200 Subject: fixed glob() edge case on windows, ref bug #47358 --- ext/standard/dir.c | 7 ++++ ext/standard/tests/file/glob_variation3.phpt | 50 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) (limited to 'ext') diff --git a/ext/standard/dir.c b/ext/standard/dir.c index f39789a5c9..c64f37c2d6 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -491,11 +491,18 @@ PHP_FUNCTION(glob) /* now catch the FreeBSD style of "no matches" */ if (!globbuf.gl_pathc || !globbuf.gl_pathv) { no_results: +#ifndef PHP_WIN32 + /* Paths containing '*', '?' and some other chars are + illegal on Windows but legit on other platforms. For + this reason the direct basedir check against the glob + query is senseless on windows. For instance while *.txt + is a pretty valid filename on EXT3, it's invalid on NTFS. */ if (PG(open_basedir) && *PG(open_basedir)) { if (php_check_open_basedir_ex(pattern, 0 TSRMLS_CC)) { RETURN_FALSE; } } +#endif array_init(return_value); return; } diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt index 4f504e668c..9c57ada3be 100644 --- a/ext/standard/tests/file/glob_variation3.phpt +++ b/ext/standard/tests/file/glob_variation3.phpt @@ -6,9 +6,27 @@ $path = dirname(__FILE__); ini_set('open_basedir', NULL); var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); ini_set('open_basedir', $path); var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); + +ini_set('open_basedir', '/tmp'); +var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); ?> ==DONE== @@ -17,4 +35,36 @@ array(0) { } array(0) { } +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} ==DONE== -- cgit v1.2.1