]> granicus.if.org Git - php/commitdiff
Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS)
authorXinchen Hui <laruence@php.net>
Sun, 17 Feb 2013 03:04:36 +0000 (11:04 +0800)
committerXinchen Hui <laruence@php.net>
Sun, 17 Feb 2013 03:04:36 +0000 (11:04 +0800)
NEWS
ext/spl/spl_directory.c
ext/spl/tests/bug64228.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index e4ee218827530bd7a7b812b96297f8eeb0e0b8af..26d56cc12570995f1b1216ee2bb67b11933d13b9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2013, PHP 5.3.23
 
+- SPL:
+  . Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
+    (patch by kriss@krizalys.com, Laruence)
+
 
 ?? ??? 2013, PHP 5.3.22
 
index 1b6a0e9b7bca0aff260309ae6872003ca07fccfa..13af7815c5468f9f134d7054021ca9c667360e6b 100644 (file)
@@ -1431,6 +1431,7 @@ SPL_METHOD(FilesystemIterator, __construct)
 SPL_METHOD(FilesystemIterator, rewind)
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
 
        if (zend_parse_parameters_none() == FAILURE) {
                return;
@@ -1442,7 +1443,7 @@ SPL_METHOD(FilesystemIterator, rewind)
        }
        do {
                spl_filesystem_dir_read(intern TSRMLS_CC);
-       } while (spl_filesystem_is_dot(intern->u.dir.entry.d_name));
+       } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name));
 }
 /* }}} */
 
diff --git a/ext/spl/tests/bug64228.phpt b/ext/spl/tests/bug64228.phpt
new file mode 100644 (file)
index 0000000..3f30dd2
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS)
+--FILE--
+<?php
+$dirs = array();
+$empty_dir = __DIR__ . "/empty";
+@mkdir($empty_dir);
+
+$i = new RecursiveDirectoryIterator($empty_dir, FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO); // Note the absence of FilesystemIterator::SKIP_DOTS
+foreach ($i as $key => $value) {
+    $dirs[] = $value->getFileName();
+}
+
+@rmdir($empty_dir);
+
+sort($dirs);
+print_r($dirs);
+?>
+--EXPECT--
+Array
+(
+    [0] => .
+    [1] => ..
+)
+