]> granicus.if.org Git - php/commitdiff
fixed glob() edge case on windows, ref bug #47358
authorAnatol Belski <ab@php.net>
Mon, 19 Aug 2013 12:21:16 +0000 (14:21 +0200)
committerStanislav Malyshev <stas@php.net>
Thu, 14 Aug 2014 23:58:16 +0000 (16:58 -0700)
ext/standard/dir.c
ext/standard/tests/file/glob_variation3.phpt

index f39789a5c9b4da02367c49cf96863d2c5d6c01ff..c64f37c2d61cdd57bd92ad9885b3030f74202bc6 100644 (file)
@@ -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;
        }
index 4f504e668c55c18ed223ccc092b74e56ea7d4711..9c57ada3be23dd85185959b1a65262669e0b47d6 100644 (file)
@@ -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==