diff options
author | Julien Pauli <jpauli@php.net> | 2014-11-29 12:11:06 +0100 |
---|---|---|
committer | Julien Pauli <jpauli@php.net> | 2014-11-29 12:11:06 +0100 |
commit | a93fb3524e33602c33dc23283d0358eafe44a1ee (patch) | |
tree | c0b9cba0ad276d6bc32c7d8753fb3f5bc6eab0b4 /ext/spl | |
parent | 4bf299a2508cd709d33f1f889e1abcfa5f61f3b3 (diff) | |
parent | 59bd4117ac6d8fb6b5866a4a0a0bbbdc12aae0ba (diff) | |
download | php-git-a93fb3524e33602c33dc23283d0358eafe44a1ee.tar.gz |
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5:
Updated NEWS
SPL: Fix for bug 66405 RecursiveDirectoryIterator with CURRENT_AS_PATHNAME
Diffstat (limited to 'ext/spl')
-rw-r--r-- | ext/spl/spl_directory.c | 40 | ||||
-rw-r--r-- | ext/spl/tests/bug66405.phpt | 59 |
2 files changed, 77 insertions, 22 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 495314abeb..2875cc2e74 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1523,29 +1523,25 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren) spl_filesystem_object_get_file_name(intern TSRMLS_CC); - if (SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) { - RETURN_STRINGL(intern->file_name, intern->file_name_len, 1); - } else { - MAKE_STD_ZVAL(zflags); - MAKE_STD_ZVAL(zpath); - ZVAL_LONG(zflags, intern->flags); - ZVAL_STRINGL(zpath, intern->file_name, intern->file_name_len, 1); - spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), &return_value, 0, zpath, zflags TSRMLS_CC); - zval_ptr_dtor(&zpath); - zval_ptr_dtor(&zflags); - - 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; + MAKE_STD_ZVAL(zflags); + MAKE_STD_ZVAL(zpath); + ZVAL_LONG(zflags, intern->flags); + ZVAL_STRINGL(zpath, intern->file_name, intern->file_name_len, 1); + spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), &return_value, 0, zpath, zflags TSRMLS_CC); + zval_ptr_dtor(&zpath); + zval_ptr_dtor(&zflags); + + 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; } } /* }}} */ diff --git a/ext/spl/tests/bug66405.phpt b/ext/spl/tests/bug66405.phpt new file mode 100644 index 0000000000..40f03ffc55 --- /dev/null +++ b/ext/spl/tests/bug66405.phpt @@ -0,0 +1,59 @@ +--TEST-- +SPL: RecursiveDirectoryIterator with CURRENT_AS_PATHNAME flag +--CREDITS-- +Paul Garvin pgarvin76@gmail.com +--FILE-- +<?php +$td = __DIR__ . '/bug66405'; +mkdir($td); +touch($td . '/file1.txt'); +touch($td . '/file2.md'); +mkdir($td . '/testsubdir'); +touch($td . '/testsubdir/file3.csv'); + +class Bug66405 extends RecursiveDirectoryIterator +{ + public function current() + { + $current = parent::current(); + echo gettype($current) . " $current\n"; + return $current; + } + + public function getChildren() + { + $children = parent::getChildren(); + if (is_object($children)) { + echo get_class($children) . " $children\n"; + } else { + echo gettype($children) . " $children\n"; + } + return $children; + } +} + +$rdi = new Bug66405($td, FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS); +$rii = new RecursiveIteratorIterator($rdi); + +ob_start(); +foreach ($rii as $file) { + //noop +} +$results = explode("\n", ob_get_clean()); +sort($results); +echo implode("\n", $results); +?> +--CLEAN-- +<?php +$td = __DIR__ . '/bug66405'; +unlink($td . '/testsubdir/file3.csv'); +unlink($td . '/file2.md'); +unlink($td . '/file1.txt'); +rmdir($td . '/testsubdir'); +rmdir($td); +?> +--EXPECTF-- +Bug66405 file3.csv +string %s/bug66405/file1.txt +string %s/bug66405/file2.md +string %s/bug66405/testsubdir/file3.csv |