From 969e64ad337e8b14c36ec4e8e75adbf51c5f8aad Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 10 Aug 2008 11:55:26 +0000 Subject: [PATCH] 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. --- 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 fd417669c4..054a742237 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -150,11 +150,11 @@ PHP_FUNCTION(symlink) 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; 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..7e2062812f --- /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-- +string(%d) "symlink_to_symlink.php_file" +string(%d) "symlink_to_symlink.php_link1" +string(%d) "symlink_to_symlink.php_nonexistant" +string(%d) "%s/symlink_to_symlink.php_file" +string(%d) "%s/symlink_to_symlink.php_link4" -- 2.50.1