diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2018-08-19 14:03:47 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2018-08-22 15:37:02 +0200 |
commit | 32a728d351aab4bac28790697cd6820a8843645f (patch) | |
tree | 82a853dd4409fa62b9b86d4ee2280bcbce654a67 /ext | |
parent | 5fb01a3a42ec850a3d0e09247414387e8964ef44 (diff) | |
download | php-git-32a728d351aab4bac28790697cd6820a8843645f.tar.gz |
Fix #68825: Exception in DirectoryIterator::getLinkTarget()
intern->file_name may not have been properly set when
DirectoryIterator::getLinkTarget() is called, so we make sure it is
before using it.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/spl/spl_directory.c | 3 | ||||
-rw-r--r-- | ext/spl/tests/bug68825.phpt | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 4942799cf7..fc4001ae1f 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1229,6 +1229,9 @@ SPL_METHOD(SplFileInfo, getLinkTarget) zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling); + if (intern->file_name == NULL) { + spl_filesystem_object_get_file_name(intern); + } #if defined(PHP_WIN32) || HAVE_SYMLINK if (intern->file_name == NULL) { php_error_docref(NULL, E_WARNING, "Empty filename"); diff --git a/ext/spl/tests/bug68825.phpt b/ext/spl/tests/bug68825.phpt new file mode 100644 index 0000000000..b1ed5fb60f --- /dev/null +++ b/ext/spl/tests/bug68825.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #68825 (Exception in DirectoryIterator::getLinkTarget()) +--FILE-- +<?php +$dir = __DIR__ . '/bug68825'; +mkdir($dir); +symlink(__FILE__, "$dir/foo"); + +$di = new \DirectoryIterator($dir); +foreach ($di as $entry) { + if ('foo' === $entry->getFilename()) { + var_dump($entry->getLinkTarget()); + } +} +?> +===DONE=== +--EXPECTF-- +string(%d) "%s%eext%espl%etests%ebug68825.php" +===DONE=== +--CLEAN-- +<?php +$dir = __DIR__ . '/bug68825'; +unlink("$dir/foo"); +rmdir($dir); +?> |