]> granicus.if.org Git - php/commitdiff
Fixed symlink("", "somthing") and link("", "somthing") in ZTS mode
authorDmitry Stogov <dmitry@php.net>
Tue, 10 Jul 2007 13:21:31 +0000 (13:21 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 10 Jul 2007 13:21:31 +0000 (13:21 +0000)
TSRM/tsrm_virtual_cwd.c
ext/standard/link.c
ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
main/fopen_wrappers.c

index 512d615cd73b53c15689a3532b76e88546e08fd6..5786e0d1302fda2282db0bd45549d025a0fac25e 100644 (file)
@@ -481,7 +481,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
        use_cache = ((use_realpath != CWD_EXPAND) && CWDG(realpath_cache_size_limit));
 
        if (path_length == 0) 
-               return (0);
+               return (1);
        if (path_length >= MAXPATHLEN)
                return (1);
 
@@ -769,9 +769,24 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC)
 {
        cwd_state new_state;
        char *retval;
+       char cwd[MAXPATHLEN];
+
+       /* realpath("") returns CWD */
+       if (!*path) {
+               new_state.cwd = (char*)malloc(1);
+               new_state.cwd[0] = '\0';
+               new_state.cwd_length = 0;               
+           if (VCWD_GETCWD(cwd, MAXPATHLEN)) {
+                   path = cwd;
+               }
+       } else if (!IS_ABSOLUTE_PATH(path, strlen(path))) {
+               CWD_STATE_COPY(&new_state, &CWDG(cwd));
+       } else {
+               new_state.cwd = (char*)malloc(1);
+               new_state.cwd[0] = '\0';
+               new_state.cwd_length = 0;               
+       }
 
-       CWD_STATE_COPY(&new_state, &CWDG(cwd));
-       
        if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)==0) {
                int len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length;
 
@@ -1202,7 +1217,15 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC)
        cwd_state new_state;
        char cwd[MAXPATHLEN];
 
-       if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
+       /* realpath("") returns CWD */
+       if (!*path) {
+               new_state.cwd = (char*)malloc(1);
+               new_state.cwd[0] = '\0';
+               new_state.cwd_length = 0;               
+           if (VCWD_GETCWD(cwd, MAXPATHLEN)) {
+                   path = cwd;
+               }
+       } else if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
            VCWD_GETCWD(cwd, MAXPATHLEN)) {
                new_state.cwd = strdup(cwd);
                new_state.cwd_length = strlen(cwd);
index 357a06c5d6c03b24f87f22d76ed6cd0531a396c4..241851bb9b5849ed971c1bd0b6a768a938cc6772 100644 (file)
@@ -135,6 +135,7 @@ PHP_FUNCTION(symlink)
        }
 
        if (!expand_filepath(frompath, source_p TSRMLS_CC) || !expand_filepath(topath, dest_p TSRMLS_CC)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory");
                RETURN_FALSE;
        }
 
@@ -185,6 +186,7 @@ PHP_FUNCTION(link)
        }
 
        if (!expand_filepath(frompath, source_p TSRMLS_CC) || !expand_filepath(topath, dest_p TSRMLS_CC)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory");
                RETURN_FALSE;
        }
 
index 71ad685eaa5458c6590201b43266940f6f777013..6d0df4f34b18d0e9a7e2765433e2d1f03ea88fb7 100644 (file)
@@ -67,6 +67,7 @@ echo "Done\n";
 --CLEAN--
 <?php
 unlink(dirname(__FILE__)."/symlink_link_linkinfo_is_link_error1.tmp");
+@unlink(dirname(__FILE__)."/symlink_link_linkinfo_is_link_link_error1.tmp");
 ?>
 --EXPECTF--
 *** Testing symlink() for error conditions ***
index 895afc4a6c07fbe70123e419f6137dea32070a8f..259b88f8489f8857de808d8e973244ad2d141501 100644 (file)
@@ -579,7 +579,9 @@ PHPAPI char *expand_filepath(const char *filepath, char *real_path TSRMLS_DC)
        char cwd[MAXPATHLEN];
        char *result;
 
-       if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) {
+       if (!filepath[0]) {
+               return NULL;
+       } else if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) {
                cwd[0] = '\0';
        } else{
                result = VCWD_GETCWD(cwd, MAXPATHLEN);