]> granicus.if.org Git - php/commitdiff
fix #68557
authorJulien Pauli <jpauli@php.net>
Fri, 20 Feb 2015 14:09:35 +0000 (15:09 +0100)
committerJulien Pauli <jpauli@php.net>
Fri, 20 Feb 2015 14:09:35 +0000 (15:09 +0100)
ext/spl/spl_directory.c
ext/spl/tests/bug68557.phpt [new file with mode: 0644]

index 7fc65cc791c3152d97c41d889de285e9243a090f..34f0415b53348e9f368ce1411778c8da1366fdb9 100644 (file)
@@ -202,18 +202,21 @@ static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *in
 {
        char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
 
-       if (!intern->file_name) {
-               switch (intern->type) {
+       switch (intern->type) {
                case SPL_FS_INFO:
                case SPL_FS_FILE:
-                       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+                       if (!intern->file_name) {
+                               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+                       }
                        break;
                case SPL_FS_DIR:
+                       if (intern->file_name) {
+                               efree(intern->file_name);
+                       }
                        intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s",
                                                         spl_filesystem_object_get_path(intern, NULL TSRMLS_CC),
                                                         slash, intern->u.dir.entry.d_name);
                        break;
-               }
        }
 } /* }}} */
 
diff --git a/ext/spl/tests/bug68557.phpt b/ext/spl/tests/bug68557.phpt
new file mode 100644 (file)
index 0000000..bcf66c9
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+Bug #68557 (SplFileInfo::getPathname() may be broken)
+--FILE--
+<?php
+mkdir(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
+touch(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'a');
+touch(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'b');
+
+$d = new DirectoryIterator(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
+
+$d->seek(0);
+var_dump($d->current()->getPathname());
+
+$d->seek(1);
+var_dump($d->current()->getPathname());
+
+$d->seek(0);
+var_dump($d->current()->getPathname());
+
+$d->seek(1);
+var_dump($d->current()->getPathname());
+
+$d->seek(2);
+var_dump($d->current()->getPathname());
+?>
+--CLEAN--
+<?php
+unlink(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'a');
+unlink(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'b');
+rmdir(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
+?>
+--EXPECTF--
+string(%d) "%s/tmp/b"
+string(%d) "%s/tmp/a"
+string(%d) "%s/tmp/b"
+string(%d) "%s/tmp/a"
+string(%d) "%s/tmp/.."
\ No newline at end of file