lbarnaud Sun Aug 10 11:54:18 2008 UTC Added files: /php-src/ext/standard/tests/file symlink_to_symlink.phpt
Modified files: /php-src/ext/standard link.c Log: 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. http://cvs.php.net/viewvc.cgi/php-src/ext/standard/link.c?r1=1.61&r2=1.62&diff_format=u Index: php-src/ext/standard/link.c diff -u php-src/ext/standard/link.c:1.61 php-src/ext/standard/link.c:1.62 --- php-src/ext/standard/link.c:1.61 Mon Dec 31 07:12:16 2007 +++ php-src/ext/standard/link.c Sun Aug 10 11:54:18 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: link.c,v 1.61 2007/12/31 07:12:16 sebastian Exp $ */ +/* $Id: link.c,v 1.62 2008/08/10 11:54:18 lbarnaud Exp $ */ #include "php.h" #include "php_filestat.h" @@ -154,11 +154,11 @@ 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; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/symlink_to_symlink.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/file/symlink_to_symlink.phpt +++ php-src/ext/standard/tests/file/symlink_to_symlink.phpt --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" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php