--- parser3/src/targets/cgi/parser3.C 2020/08/12 22:00:12 1.288 +++ parser3/src/targets/cgi/parser3.C 2020/10/03 22:58:07 1.293 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.288 2020/08/12 22:00:12 moko Exp $"; +volatile const char * IDENT_PARSER3_C="$Id: parser3.C,v 1.293 2020/10/03 22:58:07 moko Exp $"; #include "pa_config_includes.h" @@ -40,13 +40,13 @@ 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* config_filespec_cstr=0; +static const char* config_filespec_cstr=0; // -f option +static bool mail_received=false; // -m option? [asked to parse incoming message to $mail:received] static int args_skip=1; static char** argv_all = NULL; static bool cgi; ///< we were started as CGI? -static bool mail_received=false; ///< we were started with -m option? [asked to parse incoming message to $mail:received] // for signal handlers Request *request=0; @@ -143,9 +143,16 @@ void SAPI::log(SAPI_Info&, const char* f va_end(args); } -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); @@ -165,41 +172,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); } @@ -298,8 +271,7 @@ static void SIGPIPE_handler(int /*sig*/) #endif #ifdef WIN32 -const char* maybe_reconstruct_IIS_status_in_qs(const char* original) -{ +const char* maybe_reconstruct_IIS_status_in_qs(const char* original) { // 404;http://servername/page[?param=value...] // ';' should be urlencoded by HTTP standard, so we shouldn't get it from browser // and can consider that as an indication that this is IIS way to report errors @@ -493,7 +465,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) { @@ -503,14 +475,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) { - if(system_exception) if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord) throw Exception("system", 0, "0x%08X at 0x%08X", er->ExceptionCode, er->ExceptionAddress); @@ -641,34 +612,8 @@ int main(int argc, char *argv[]) { try { // global try REAL_PARSER_HANDLER(filespec_to_process, request_method, header_only); - } catch(const Exception& e) { // global problem - // don't allocate anything on pool here: - // possible pool' exception not catch-ed now - // and there could be out-of-memory exception - char buf[MAX_STRING]; - snprintf(buf, MAX_STRING, "Unhandled exception %s", e.comment()); - // log it - SAPI::log(SAPI_info, "%s", buf); - - // - int content_length=strlen(buf); - - // prepare header - // capitalized headers are used for preventing malloc during capitalization - SAPI::add_header_attribute(SAPI_info, HTTP_CONTENT_TYPE_CAPITALIZED, "text/plain"); - // don't use 'format' function because it calls malloc - char content_length_cstr[MAX_NUMBER]; - snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); - SAPI::add_header_attribute(SAPI_info, HTTP_CONTENT_LENGTH_CAPITALIZED, content_length_cstr); - - // send header - SAPI::send_header(SAPI_info); - - // send body - if(!header_only) - SAPI::send_body(SAPI_info, buf, content_length); - - // unsuccessful finish + } catch(const Exception& e) { // exception in unhandled exception + SAPI::die("Unhandled exception %s", e.comment()); } #ifdef PA_DEBUG_CGI_ENTRY_EXIT