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