Do not expand $target in symlink(). This made it impossible to symlink to a
symlink. This also caused the target to be wrongly expanded relatively to
the CWD when target was not an absolute path.
This commit is contained in:
Arnaud Le Blanc 2008-08-10 11:54:41 +00:00
parent 5c7e2072c6
commit f1917e104b
2 changed files with 49 additions and 5 deletions

View File

@ -149,11 +149,11 @@ PHP_FUNCTION(symlink)
RETURN_FALSE;
}
#ifndef ZTS
ret = symlink(topath, frompath);
#else
ret = symlink(dest_p, source_p);
#endif
/* For the source, an expanded path must be used (in ZTS an other thread could have changed the CWD).
* For the target the exact string given by the user must be used, relative or not, existing or not.
* The target is relative to the link itself, not to the CWD. */
ret = symlink(topath, source_p);
if (ret == -1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
RETURN_FALSE;

View File

@ -0,0 +1,44 @@
--TEST--
symlink() using a relative path, and symlink() to a symlink
--FILE--
<?php
$prefix = __FILE__;
touch($prefix . "_file");
// symlink to a regular file using a relative dest
symlink(basename($prefix . "_file"), $prefix . "_link1");
// symlink to a symlink using a relative path
symlink(basename($prefix . "_link1"), $prefix . "_link2");
// symlink to a non-existent path
@unlink($prefix . "_nonexistant");
symlink(basename($prefix . "_nonexistant"), $prefix . "_link3");
// symlink to a regular file using an absolute path
symlink($prefix . "_file", $prefix . "_link4");
// symlink to a symlink using an absolute path
symlink($prefix . "_link4", $prefix . "_link5");
var_dump(readlink($prefix . "_link1"));
var_dump(readlink($prefix . "_link2"));
var_dump(readlink($prefix . "_link3"));
var_dump(readlink($prefix . "_link4"));
var_dump(readlink($prefix . "_link5"));
unlink($prefix . "_link5");
unlink($prefix . "_link4");
unlink($prefix . "_link3");
unlink($prefix . "_link2");
unlink($prefix . "_link1");
unlink($prefix . "_file");
?>
--EXPECTF--
%unicode|string%(%d) "symlink_to_symlink.php_file"
%unicode|string%(%d) "symlink_to_symlink.php_link1"
%unicode|string%(%d) "symlink_to_symlink.php_nonexistant"
%unicode|string%(%d) "%s/symlink_to_symlink.php_file"
%unicode|string%(%d) "%s/symlink_to_symlink.php_link4"