]> granicus.if.org Git - php/commitdiff
MFH: Fix bug #47534 (RecursiveDirectoryIterator::getChildren ignoring CURRENT_AS_PATH...
authorEtienne Kneuss <colder@php.net>
Sat, 9 May 2009 21:06:59 +0000 (21:06 +0000)
committerEtienne Kneuss <colder@php.net>
Sat, 9 May 2009 21:06:59 +0000 (21:06 +0000)
NEWS
ext/spl/spl_directory.c
ext/spl/tests/bug47534.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 83c77ed72c07c47319441b6475c4325925f5d9b4..ab6255f71ef60ff8b0d33bc8fb47c043142fa619 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -63,6 +63,8 @@ PHP                                                                        NEWS
 - Fixed bug #47560 (explode()'s limit parameter odd behaviour). (Matt)
 - Fixed bug #47535 (Compilation failure in ps_fetch_from_1_to_8_bytes()).
   (Johannes)
+- Fixed bug #47534 (RecursiveDiteratoryIterator::getChildren ignoring
+  CURRENT_AS_PATHNAME). (Etienne)
 - Fixed bug #47516 (nowdoc can not be embed in heredoc but can be embed in
   double quote). (Dmitry)
 - Fixed bug #47038 (Memory leak in include). (Dmitry)
index 92495dbe3fcd55f77f8e6dc63c475064992377d8..fe1949ef8f4c8211821543bb4940fb7ab890c538 100755 (executable)
@@ -1268,24 +1268,27 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
        
        spl_filesystem_object_get_file_name(intern TSRMLS_CC);
 
-       INIT_PZVAL(&zflags);
-       INIT_PZVAL(&zpath);
-       ZVAL_LONG(&zflags, intern->flags);
-       ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len, 0);
-
-       spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), &return_value, 0, &zpath, &zflags TSRMLS_CC);
-       
-       subdir = (spl_filesystem_object*)zend_object_store_get_object(return_value TSRMLS_CC);
-       if (subdir) {
-               if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) {
-                       subdir->u.dir.sub_path_len = spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
-               } else {
-                       subdir->u.dir.sub_path_len = strlen(intern->u.dir.entry.d_name);
-                       subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len);
+       if (SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) {
+               RETURN_STRINGL(intern->file_name, intern->file_name_len, 1);
+       } else {
+               INIT_PZVAL(&zflags);
+               INIT_PZVAL(&zpath);
+               ZVAL_LONG(&zflags, intern->flags);
+               ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len, 0);
+               spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), &return_value, 0, &zpath, &zflags TSRMLS_CC);
+               
+               subdir = (spl_filesystem_object*)zend_object_store_get_object(return_value TSRMLS_CC);
+               if (subdir) {
+                       if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) {
+                               subdir->u.dir.sub_path_len = spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
+                       } else {
+                               subdir->u.dir.sub_path_len = strlen(intern->u.dir.entry.d_name);
+                               subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len);
+                       }
+                       subdir->info_class = intern->info_class;
+                       subdir->file_class = intern->file_class;
+                       subdir->oth = intern->oth;
                }
-               subdir->info_class = intern->info_class;
-               subdir->file_class = intern->file_class;
-               subdir->oth = intern->oth;
        }
 }
 /* }}} */
diff --git a/ext/spl/tests/bug47534.phpt b/ext/spl/tests/bug47534.phpt
new file mode 100644 (file)
index 0000000..d221c23
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+SPL: RecursiveDirectoryIterator bug 47534
+--FILE--
+<?php
+$it1 = new RecursiveDirectoryIterator(dirname(__FILE__), FileSystemIterator::CURRENT_AS_PATHNAME);
+$it1->rewind();
+echo gettype($it1->current())."\n";
+
+$it2 = new RecursiveDirectoryIterator(dirname(__FILE__));
+$it2->rewind();
+echo gettype($it2->current())."\n";
+--EXPECT--
+string
+object