--- parser3/src/targets/cgi/parser3.C 2019/12/27 21:32:33 1.286 +++ parser3/src/targets/cgi/parser3.C 2020/08/13 11:44:21 1.290 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.286 2019/12/27 21:32:33 moko Exp $"; +volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.290 2020/08/13 11:44:21 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); @@ -146,8 +144,18 @@ void SAPI::log(SAPI_Info&, const char* f } static void die_or_abort(const char* fmt, va_list args, bool write_core) { - // inform user +} + +void SAPI::die(const char* fmt, ...) { + va_list args; + + // logging first, first vsnprintf + va_start(args,fmt); + ::log(fmt, args); + va_end(args); + // inform user, second vsnprintf + va_start(args, fmt); char body[MAX_STRING]; int content_length=vsnprintf(body, MAX_STRING, fmt, args); @@ -167,41 +175,7 @@ static void die_or_abort(const char* fmt // body SAPI::send_body(SAPI_info, body, content_length); - // exit & try to produce core dump[unix] or invoke debugger[Win32 Debug version] - if(write_core) { -#ifdef WIN32 - // IIS with abort failes to show STDOUT, it just barks "abnormal program termination" - exit(1); -#else - abort(); -#endif - } else - exit(1); -} - -void SAPI::die(const char* fmt, ...) { - va_list args; - - // logging first, can't log inside die_or_abort due to vsnprintf (bug #106) - va_start(args,fmt); - ::log(fmt, args); - va_end(args); - - va_start(args, fmt); - die_or_abort(fmt, args, false /*write core?*/); -// va_end(args); -} - -void SAPI::abort(const char* fmt, ...) { - va_list args; - - // logging first, can't log inside die_or_abort due to vsnprintf (bug #106) - va_start(args,fmt); - ::log(fmt, args); - va_end(args); - - va_start(args, fmt); - die_or_abort(fmt, args, true /*write core?*/); + exit(1); // va_end(args); } @@ -272,15 +246,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 +323,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 @@ -465,36 +455,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 } @@ -503,7 +469,7 @@ static void real_parser_handler(const ch } #ifdef PA_SUPPRESS_SYSTEM_EXCEPTION -static const Exception call_real_parser_handler__do_PEH_return_it(const char* filespec_to_process, const char* request_method, bool header_only){ +static const Exception call_real_parser_handler__do_PEH_return_it(const char* filespec_to_process, const char* request_method, bool header_only) { try { real_parser_handler(filespec_to_process, request_method, header_only); } catch(const Exception& e) { @@ -513,17 +479,13 @@ static const Exception call_real_parser_ return Exception(); } -static void call_real_parser_handler__supress_system_exception(const char* filespec_to_process, const char* request_method, bool header_only){ +static void call_real_parser_handler__supress_system_exception(const char* filespec_to_process, const char* request_method, bool header_only) { Exception parser_exception; LPEXCEPTION_POINTERS system_exception=0; __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) throw Exception("system", 0, "0x%08X at 0x%08X", er->ExceptionCode, er->ExceptionAddress); @@ -575,8 +537,6 @@ int main(int argc, char *argv[]) { #endif argv_all=argv; - argv0=argv[0]; - umask(2); // were we started as CGI?