--- parser3/src/targets/cgi/parser3.C 2019/12/27 20:46:26 1.285 +++ parser3/src/targets/cgi/parser3.C 2020/08/12 22:00:12 1.288 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.285 2019/12/27 20:46:26 moko Exp $"; +volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.288 2020/08/12 22:00:12 moko Exp $"; #include "pa_config_includes.h" @@ -25,7 +25,7 @@ volatile const char * IDENT_PARSER3_C="$ // defines // comment remove me after debugging -//#define PA_DEBUG_CGI_ENTRY_EXIT "parser3-debug.log" +//#define PA_DEBUG_CGI_ENTRY_EXIT "parser3-debug.log" #if defined(_MSC_VER) && !defined(_DEBUG) # define PA_SUPPRESS_SYSTEM_EXCEPTION @@ -40,9 +40,7 @@ volatile const char * IDENT_PARSER3_C="$ /// IIS refuses to read bigger chunks const size_t READ_POST_CHUNK_SIZE=0x400*0x400; // 1M -static const char* argv0; static const char* config_filespec_cstr=0; -static bool fail_on_config_read_problem=true; static int args_skip=1; static char** argv_all = NULL; @@ -113,8 +111,8 @@ static void log(const char* fmt, va_list if(request_info) fprintf(f, " [uri=%s, method=%s, cl=%lu]", - request_info->uri? request_info->uri: "", - request_info->method? request_info->method: "", + request_info->uri ? request_info->uri : "", + request_info->method ? request_info->method : "", request_info->content_length); else fputs(" [no request info]", f); @@ -272,15 +270,9 @@ static void full_file_spec(const char* f static void log_signal(const char* signal_name) { if(request_info) - SAPI::log(SAPI_info, "%s received while %s. uri=%s, method=%s, cl=%u", - signal_name, - request ? "executing code" : "reading data", - request_info->uri, - request_info->method, - request_info->content_length); + SAPI::log(SAPI_info, "%s received while %s.", signal_name, request ? "executing code" : "reading data"); else - SAPI::log(SAPI_info, "%s received before or after processing request", - signal_name); + SAPI::log(SAPI_info, "%s received before or after processing request", signal_name); } #ifdef SIGUSR1 @@ -355,6 +347,28 @@ public: } }; +static bool locate_config(){ + if(!config_filespec_cstr) { + config_filespec_cstr=getenv(PARSER_CONFIG_ENV_NAME); + if(!config_filespec_cstr) + config_filespec_cstr=getenv(REDIRECT_PREFIX PARSER_CONFIG_ENV_NAME); + if(!config_filespec_cstr){ + // beside by binary + char beside_binary_path[MAX_STRING]; + strncpy(beside_binary_path, argv_all[0], MAX_STRING-1); beside_binary_path[MAX_STRING-1]=0; // filespec of my binary + if(!(rsplit(beside_binary_path, '/') || rsplit(beside_binary_path, '\\'))) { // strip filename + // no path, just filename + // @todo full path, not ./! + beside_binary_path[0]='.'; beside_binary_path[1]=0; + } + char config_filespec_buf[MAX_STRING]; + snprintf(config_filespec_buf, MAX_STRING, "%s/%s", beside_binary_path, AUTO_FILE_NAME); + config_filespec_cstr=pa_strdup(config_filespec_buf); + return entry_exists(config_filespec_cstr); + } + } + return true; +} /** main workhorse @@ -423,7 +437,7 @@ static void real_parser_handler(const ch SAPI::die("CGI: illegal call (1)"); } else { // fcgiwrap minimalistic setup - if(request_info.query_string) { + if(request_info.query_string && *request_info.query_string) { char* reconstructed_uri = new(PointerFreeGC) char[strlen(path_info) + 1/*'?'*/+ strlen(request_info.query_string) + 1/*0*/]; strcpy(reconstructed_uri, path_info); strcat(reconstructed_uri, "?"); @@ -465,36 +479,12 @@ static void real_parser_handler(const ch // prepare to process request Request request(SAPI_info, request_info, cgi ? String::Language(String::L_HTML|String::L_OPTIMIZE_BIT) : String::L_AS_IS); - { // get ::request ptr for signal handlers RequestController rc(&request); - - char config_filespec_buf[MAX_STRING]; - if(!config_filespec_cstr) { - const char* config_by_env=getenv(PARSER_CONFIG_ENV_NAME); - if(!config_by_env) - config_by_env=getenv(REDIRECT_PREFIX PARSER_CONFIG_ENV_NAME); - if(config_by_env) - config_filespec_cstr=config_by_env; - else { - // beside by binary - char beside_binary_path[MAX_STRING]; - strncpy(beside_binary_path, argv0, MAX_STRING-1); beside_binary_path[MAX_STRING-1]=0; // filespec of my binary - if(!(rsplit(beside_binary_path, '/') || rsplit(beside_binary_path, '\\'))) { // strip filename - // no path, just filename - // @todo full path, not ./! - beside_binary_path[0]='.'; beside_binary_path[1]=0; - } - snprintf(config_filespec_buf, MAX_STRING, "%s/%s", beside_binary_path, AUTO_FILE_NAME); - config_filespec_cstr=config_filespec_buf; - fail_on_config_read_problem=entry_exists(config_filespec_cstr); - } - } - + bool fail_on_config_read_problem=locate_config(); // process the request request.core(config_filespec_cstr, fail_on_config_read_problem, header_only); - // ::request cleared in RequestController desctructor to prevent signal handlers from accessing invalid memory } @@ -519,10 +509,7 @@ static void call_real_parser_handler__su __try { parser_exception=call_real_parser_handler__do_PEH_return_it(filespec_to_process, request_method, header_only); - } __except ( - (system_exception=GetExceptionInformation()), - EXCEPTION_EXECUTE_HANDLER) - { + } __except ( (system_exception=GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { if(system_exception) if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord) @@ -575,8 +562,6 @@ int main(int argc, char *argv[]) { #endif argv_all=argv; - argv0=argv[0]; - umask(2); // were we started as CGI?