lbarnaud                Sun Aug 10 11:54:18 2008 UTC

  Added files:                 
    /php-src/ext/standard/tests/file    symlink_to_symlink.phpt 

  Modified files:              
    /php-src/ext/standard       link.c 
  Log:
  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.61&r2=1.62&diff_format=u
Index: php-src/ext/standard/link.c
diff -u php-src/ext/standard/link.c:1.61 php-src/ext/standard/link.c:1.62
--- php-src/ext/standard/link.c:1.61    Mon Dec 31 07:12:16 2007
+++ php-src/ext/standard/link.c Sun Aug 10 11:54:18 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: link.c,v 1.61 2007/12/31 07:12:16 sebastian Exp $ */
+/* $Id: link.c,v 1.62 2008/08/10 11:54:18 lbarnaud Exp $ */
 
 #include "php.h"
 #include "php_filestat.h"
@@ -154,11 +154,11 @@
                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;

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

Reply via email to