]> granicus.if.org Git - php/commitdiff
Fixed bug #51860 (Include fails with toplevel symlink to /)
authorDmitry Stogov <dmitry@php.net>
Mon, 30 Jan 2012 10:08:11 +0000 (10:08 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 30 Jan 2012 10:08:11 +0000 (10:08 +0000)
TSRM/tsrm_virtual_cwd.c

index 28b929d8936949b3ceabecddb0f1eda952746337..683d6a4d52d2f1a5d8e673683668748285b84333 100644 (file)
@@ -760,6 +760,9 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
 
        while (1) {
                if (len <= start) {
+                       if (link_is_dir) {
+                               *link_is_dir = 1;
+                       }
                        return start;
                }
 
@@ -776,6 +779,10 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
                        continue;
                } else if (i == len - 2 && path[i] == '.' && path[i+1] == '.') {
                        /* remove '..' and previous directory */
+                       is_dir = 1;
+                       if (link_is_dir) {
+                               *link_is_dir = 1;
+                       }
                        if (i - 1 <= start) {
                                return start ? start : len;
                        }
@@ -1200,9 +1207,14 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
                                return 1;
                        }
                        memcpy(resolved_path, state->cwd, state_cwd_length);
-                       resolved_path[state_cwd_length] = DEFAULT_SLASH;
-                       memcpy(resolved_path + state_cwd_length + 1, path, path_length + 1);
-                       path_length += state_cwd_length + 1;
+                       if (resolved_path[state_cwd_length-1] == DEFAULT_SLASH) {
+                               memcpy(resolved_path + state_cwd_length, path, path_length + 1);
+                               path_length += state_cwd_length;
+                       } else {
+                               resolved_path[state_cwd_length] = DEFAULT_SLASH;
+                               memcpy(resolved_path + state_cwd_length + 1, path, path_length + 1);
+                               path_length += state_cwd_length + 1;
+                       }
                }
        } else {
 #ifdef TSRM_WIN32