From 726dfc423da8e08380d6b8252731efdf6c2e6c3d Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 10 Aug 2008 11:54:18 +0000 Subject: [PATCH] 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. --- ext/standard/link.c | 10 ++--- .../tests/file/symlink_to_symlink.phpt | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 ext/standard/tests/file/symlink_to_symlink.phpt diff --git a/ext/standard/link.c b/ext/standard/link.c index a2517580c1..1b97a4da03 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -154,11 +154,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; diff --git a/ext/standard/tests/file/symlink_to_symlink.phpt b/ext/standard/tests/file/symlink_to_symlink.phpt new file mode 100644 index 0000000000..cf12a1d0b7 --- /dev/null +++ b/ext/standard/tests/file/symlink_to_symlink.phpt @@ -0,0 +1,44 @@ +--TEST-- +symlink() using a relative path, and symlink() to a symlink +--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" -- 2.50.1