]> granicus.if.org Git - php/commitdiff
Fixed bug #45151 (Crash with URI/file..php (filename contains 2 dots))
authorDmitry Stogov <dmitry@php.net>
Tue, 15 Jul 2008 13:38:56 +0000 (13:38 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 15 Jul 2008 13:38:56 +0000 (13:38 +0000)
sapi/cgi/cgi_main.c

index 57d8bf85677143a0f12baa68465a3295611f6062..f7904408f275905d0fc16e8d1552ad761f043ca3 100644 (file)
@@ -876,6 +876,39 @@ static void php_cgi_usage(char *argv0)
 }
 /* }}} */
 
+/* {{{ is_valid_path
+ *
+ * some server configurations allow '..' to slip through in the
+ * translated path.   We'll just refuse to handle such a path.
+ */
+static int is_valid_path(const char *path)
+{
+       const char *p;
+
+       if (!path) {
+               return 0;
+       }
+       p = strstr(path, "..");
+       if (p) {
+               if ((p == path || IS_SLASH(*(p-1))) &&
+                   (*(p+2) == 0 || IS_SLASH(*(p+2)))) {
+                       return 0;
+               }
+               while (1) {
+                       p = strstr(p+1, "..");
+                       if (!p) {
+                               break;
+                       }
+                       if (IS_SLASH(*(p-1)) &&
+                           (*(p+2) == 0 || IS_SLASH(*(p+2)))) {
+                                       return 0;
+                       }
+               }
+       }
+       return 1;
+}
+/* }}} */
+
 /* {{{ init_request_info
 
   initializes request_info structure
@@ -1171,9 +1204,7 @@ static void init_request_info(TSRMLS_D)
                                if (pt) {
                                        efree(pt);
                                }
-                               /* some server configurations allow '..' to slip through in the
-                                  translated path.   We'll just refuse to handle such a path. */
-                               if (script_path_translated && !strstr(script_path_translated, "..")) {
+                               if (is_valid_path(script_path_translated)) {
                                        SG(request_info).path_translated = estrdup(script_path_translated);
                                }
                        } else {
@@ -1204,9 +1235,7 @@ static void init_request_info(TSRMLS_D)
                                } else {
                                        SG(request_info).request_uri = env_script_name;
                                }
-                               /* some server configurations allow '..' to slip through in the
-                                  translated path.   We'll just refuse to handle such a path. */
-                               if (script_path_translated && !strstr(script_path_translated, "..")) {
+                               if (is_valid_path(script_path_translated)) {
                                        SG(request_info).path_translated = estrdup(script_path_translated);
                                }
                                free(real_path);
@@ -1221,9 +1250,7 @@ static void init_request_info(TSRMLS_D)
                        if (!CGIG(discard_path) && env_path_translated) {
                                script_path_translated = env_path_translated;
                        }
-                       /* some server configurations allow '..' to slip through in the
-                          translated path.   We'll just refuse to handle such a path. */
-                       if (script_path_translated && !strstr(script_path_translated, "..")) {
+                       if (is_valid_path(script_path_translated)) {
                                SG(request_info).path_translated = estrdup(script_path_translated);
                        }
                }