]> granicus.if.org Git - php/commitdiff
Do not expand $target in symlink(). This made it impossible to symlink to a
authorArnaud Le Blanc <lbarnaud@php.net>
Sun, 10 Aug 2008 11:54:18 +0000 (11:54 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Sun, 10 Aug 2008 11:54:18 +0000 (11:54 +0000)
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
ext/standard/tests/file/symlink_to_symlink.phpt [new file with mode: 0644]

index a2517580c1b0b2990beba65e5d37a3192b4d4496..1b97a4da037a6c98aa359c3d37d8764d8c55e953 100644 (file)
@@ -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 (file)
index 0000000..cf12a1d
--- /dev/null
@@ -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"