Skip to content

Commit c111d1c

Browse files
author
Julien Pauli
committed
fix #68557
1 parent 9fb48ed commit c111d1c

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

ext/spl/spl_directory.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,18 +202,21 @@ static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *in
202202
{
203203
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
204204

205-
if (!intern->file_name) {
206-
switch (intern->type) {
205+
switch (intern->type) {
207206
case SPL_FS_INFO:
208207
case SPL_FS_FILE:
209-
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
208+
if (!intern->file_name) {
209+
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
210+
}
210211
break;
211212
case SPL_FS_DIR:
213+
if (intern->file_name) {
214+
efree(intern->file_name);
215+
}
212216
intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s",
213217
spl_filesystem_object_get_path(intern, NULL TSRMLS_CC),
214218
slash, intern->u.dir.entry.d_name);
215219
break;
216-
}
217220
}
218221
} /* }}} */
219222

ext/spl/tests/bug68557.phpt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
Bug #68557 (SplFileInfo::getPathname() may be broken)
3+
--FILE--
4+
<?php
5+
mkdir(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
6+
touch(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'a');
7+
touch(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'b');
8+
9+
$d = new DirectoryIterator(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
10+
11+
$d->seek(0);
12+
var_dump($d->current()->getPathname());
13+
14+
$d->seek(1);
15+
var_dump($d->current()->getPathname());
16+
17+
$d->seek(0);
18+
var_dump($d->current()->getPathname());
19+
20+
$d->seek(1);
21+
var_dump($d->current()->getPathname());
22+
23+
$d->seek(2);
24+
var_dump($d->current()->getPathname());
25+
?>
26+
--CLEAN--
27+
<?php
28+
unlink(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'a');
29+
unlink(__DIR__ . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'b');
30+
rmdir(__DIR__ . DIRECTORY_SEPARATOR . 'tmp');
31+
?>
32+
--EXPECTF--
33+
string(%d) "%s/tmp/b"
34+
string(%d) "%s/tmp/a"
35+
string(%d) "%s/tmp/b"
36+
string(%d) "%s/tmp/a"
37+
string(%d) "%s/tmp/.."

0 commit comments

Comments
 (0)