]> granicus.if.org Git - php/commitdiff
- Fix problem with VIRTUAL_DIR and relative paths containing ..
authorAndi Gutmans <andi@php.net>
Wed, 28 Jun 2000 17:30:30 +0000 (17:30 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 28 Jun 2000 17:30:30 +0000 (17:30 +0000)
main/php_virtual_cwd.c

index 392f1444ad53a80abdc28f4db2a1e7956c07715e..3fd4d5542c6946c07472e2a6d51c1b6f87832f9e 100644 (file)
@@ -281,9 +281,30 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
 #ifndef ZEND_WIN32
        if (strstr(path, "..")) {
                /* If .. is found then we need to resolve real path as the .. code doesn't work with symlinks */
-               if (realpath(path, resolved_path)) {
-                       path = resolved_path;
-                       path_length = strlen(path);
+               if (IS_ABSOLUTE_PATH(path, path_length)) {
+                       if (realpath(path, resolved_path)) {
+                               path = resolved_path;
+                               path_length = strlen(path);
+                       }
+               } else { /* Concat current directory with relative path and then run realpath() on it */
+                       char *tmp;
+                       char *ptr;
+
+                       ptr = tmp = (char *) malloc(state->cwd_length+path_length+sizeof("/"));
+                       if (!tmp) {
+                               return 1;
+                       }
+                       memcpy(ptr, state->cwd, state->cwd_length);
+                       ptr += state->cwd_length;
+                       *ptr++ = DEFAULT_SLASH;
+                       memcpy(ptr, path, path_length);
+                       ptr += path_length;
+                       *ptr = '\0';
+                       if (realpath(tmp, resolved_path)) {
+                               path = resolved_path;
+                               path_length = strlen(path);
+                       }
+                       free(tmp);
                }
        }
 #endif