OSDN Git Service

httpd: fix bug where we did chdir("") if CGI path had only one "/".
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 11 Feb 2008 16:26:22 +0000 (16:26 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 11 Feb 2008 16:26:22 +0000 (16:26 -0000)
httpd: fix bug 2004: wrong argv when interpreter is invoked

+8 bytes growth

networking/httpd.c

index 3ac9b90..779f070 100644 (file)
@@ -1417,37 +1417,39 @@ static void send_cgi_and_exit(
                 * If CGI really wants that, it can always do dup itself. */
                /* dup2(1, 2); */
 
-               /* script must have absolute path */
                script = strrchr(fullpath, '/');
                //fullpath is a result of concat_path_file and always has '/'
                //if (!script)
                //      goto error_execing_cgi;
                *script = '\0';
                /* chdiring to script's dir */
-               if (chdir(fullpath) == 0) {
-                       char *argv[2];
+               if (chdir(script == fullpath ? "/" : fullpath) == 0) {
+                       char *argv[3];
+
+                       *script++ = '/'; /* repair fullpath */
+                       /* set argv[0] to name without path */
+                       argv[0] = script;
+                       argv[1] = NULL;
+
 #if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
-                       char *interpr = NULL;
-                       char *suffix = strrchr(purl, '.');
-
-                       if (suffix) {
-                               Htaccess *cur;
-                               for (cur = script_i; cur; cur = cur->next) {
-                                       if (strcmp(cur->before_colon + 1, suffix) == 0) {
-                                               interpr = cur->after_colon;
-                                               break;
+                       {
+                               char *suffix = strrchr(script, '.');
+
+                               if (suffix) {
+                                       Htaccess *cur;
+                                       for (cur = script_i; cur; cur = cur->next) {
+                                               if (strcmp(cur->before_colon + 1, suffix) == 0) {
+                                                       /* found interpreter name */
+                                                       fullpath = cur->after_colon;
+                                                       argv[0] = cur->after_colon;
+                                                       argv[1] = script;
+                                                       argv[2] = NULL;
+                                                       break;
+                                               }
                                        }
                                }
                        }
 #endif
-                       *script = '/';
-                       /* set argv[0] to name without path */
-                       argv[0] = script + 1;
-                       argv[1] = NULL;
-#if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
-                       if (interpr)
-                               fullpath = interpr;
-#endif
                        execv(fullpath, argv);
                        if (verbose)
                                bb_perror_msg("exec %s", fullpath);