diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/httpd.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index 3ac9b906a..779f070d9 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -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); |