lbarnaud Sun Aug 10 11:55:26 2008 UTC Added files: (Branch: PHP_5_2) /php-src/ext/standard/tests/file symlink_to_symlink.phpt
Modified files: /php-src/ext/standard link.c Log: MFH: 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.52.2.1.2.4&r2=1.52.2.1.2.5&diff_format=u Index: php-src/ext/standard/link.c diff -u php-src/ext/standard/link.c:1.52.2.1.2.4 php-src/ext/standard/link.c:1.52.2.1.2.5 --- php-src/ext/standard/link.c:1.52.2.1.2.4 Mon Dec 31 07:20:12 2007 +++ php-src/ext/standard/link.c Sun Aug 10 11:55:26 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: link.c,v 1.52.2.1.2.4 2007/12/31 07:20:12 sebastian Exp $ */ +/* $Id: link.c,v 1.52.2.1.2.5 2008/08/10 11:55:26 lbarnaud Exp $ */ #include "php.h" #include "php_filestat.h" @@ -150,11 +150,11 @@ RETURN_FALSE; } -#ifndef ZTS - ret = symlink(Z_STRVAL_PP(topath), Z_STRVAL_PP(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(Z_STRVAL_PP(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