From 481c4715d4f4c77293d65216324215f671954660 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Tue, 8 Jan 2013 15:02:04 +0100 Subject: [PATCH 1/4] - fix bug #47358, glob returns error, should be empty array() Conflicts: ext/standard/dir.c --- NEWS | 3 +++ ext/standard/dir.c | 4 +--- ext/standard/tests/file/glob_variation3.phpt | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 2429492cc60..a34ea04b3ae 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2014, PHP 5.4.33 +- Core: + . Fixed bug #47358 (glob returns error, should be empty array()). (Pierre) + - OpenSSL: . Fixed bug #41631 (socket timeouts not honored in blocking SSL reads) (Daniel Lowrey). diff --git a/ext/standard/dir.c b/ext/standard/dir.c index c6d6ddd2633..f39789a5c9b 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -492,9 +492,7 @@ PHP_FUNCTION(glob) if (!globbuf.gl_pathc || !globbuf.gl_pathv) { no_results: if (PG(open_basedir) && *PG(open_basedir)) { - struct stat s; - - if (0 != VCWD_STAT(pattern, &s) || S_IFDIR != (s.st_mode & S_IFMT)) { + if (php_check_open_basedir_ex(pattern, 0 TSRMLS_CC)) { RETURN_FALSE; } } diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt index 9e1e28baf92..4f504e668c5 100644 --- a/ext/standard/tests/file/glob_variation3.phpt +++ b/ext/standard/tests/file/glob_variation3.phpt @@ -15,5 +15,6 @@ var_dump(glob("$path/*.none")); --EXPECT-- array(0) { } -bool(false) +array(0) { +} ==DONE== From ad492ca9327fc9f7f0ea7a0ddd32e62cdf0c9137 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 19 Aug 2013 14:21:16 +0200 Subject: [PATCH 2/4] 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(+) diff --git a/ext/standard/dir.c b/ext/standard/dir.c index f39789a5c9b..c64f37c2d61 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 4f504e668c5..9c57ada3be2 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== From b7cd099ae04c926f8faedbf8c726984d9315ccb9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 20 Aug 2013 13:39:30 +0200 Subject: [PATCH 3/4] split the glob() test to test different basedir --- ext/standard/tests/file/glob_variation3.phpt | 43 ++------------------ ext/standard/tests/file/glob_variation4.phpt | 33 +++++++++++++++ ext/standard/tests/file/glob_variation5.phpt | 29 +++++++++++++ ext/standard/tests/file/glob_variation6.phpt | 35 ++++++++++++++++ 4 files changed, 100 insertions(+), 40 deletions(-) create mode 100644 ext/standard/tests/file/glob_variation4.phpt create mode 100644 ext/standard/tests/file/glob_variation5.phpt create mode 100644 ext/standard/tests/file/glob_variation6.phpt diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt index 9c57ada3be2..c50f8a81b80 100644 --- a/ext/standard/tests/file/glob_variation3.phpt +++ b/ext/standard/tests/file/glob_variation3.phpt @@ -5,6 +5,7 @@ Test glob() function: ensure no platform difference $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")); @@ -12,22 +13,7 @@ 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")); - +var_dump(empty(ini_get('open_basedir'))); ?> ==DONE== --EXPECT-- @@ -43,28 +29,5 @@ 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) { -} +bool(true) ==DONE== diff --git a/ext/standard/tests/file/glob_variation4.phpt b/ext/standard/tests/file/glob_variation4.phpt new file mode 100644 index 00000000000..00d8f648aad --- /dev/null +++ b/ext/standard/tests/file/glob_variation4.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 2 +--FILE-- + +==DONE== +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +bool(true) +==DONE== diff --git a/ext/standard/tests/file/glob_variation5.phpt b/ext/standard/tests/file/glob_variation5.phpt new file mode 100644 index 00000000000..10db40099bc --- /dev/null +++ b/ext/standard/tests/file/glob_variation5.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 3 +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECT-- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(true) +==DONE== diff --git a/ext/standard/tests/file/glob_variation6.phpt b/ext/standard/tests/file/glob_variation6.phpt new file mode 100644 index 00000000000..9cd9c2b3538 --- /dev/null +++ b/ext/standard/tests/file/glob_variation6.phpt @@ -0,0 +1,35 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 4 +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +bool(true) +==DONE== From eab42649ab9c6d949dc8e1ba9e31124e9cfb3b1b Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Thu, 14 Aug 2014 17:07:28 -0700 Subject: [PATCH 4/4] fix test --- ext/standard/tests/file/glob_variation3.phpt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt index c50f8a81b80..257b5c365e6 100644 --- a/ext/standard/tests/file/glob_variation3.phpt +++ b/ext/standard/tests/file/glob_variation3.phpt @@ -13,7 +13,8 @@ var_dump(glob("$path/*/nothere")); var_dump(glob("$path/[aoeu]*.none")); var_dump(glob("$path/directly_not_exists")); -var_dump(empty(ini_get('open_basedir'))); +$b = ini_get('open_basedir'); +var_dump(empty($b)); ?> ==DONE== --EXPECT--