{
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;
- }
}
} /* }}} */
--- /dev/null
+--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