--- parser3/src/main/pa_common.C 2003/04/02 11:41:22 1.143.2.21.2.22 +++ parser3/src/main/pa_common.C 2003/04/08 14:46:27 1.143.2.21.2.24 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_COMMON_C="$Date: 2003/04/02 11:41:22 $"; +static const char* IDENT_COMMON_C="$Date: 2003/04/08 14:46:27 $"; #include "pa_common.h" #include "pa_exception.h" @@ -229,18 +229,17 @@ static int http_read_response(String& re /* ********************** request *************************** */ #if defined(SIGALRM) && defined(HAVE_SIGSETJMP) && defined(HAVE_SIGLONGJMP) -# define WE_CAN_USE_ALARM +# define PA_USE_ALARM #endif -#ifdef WE_CAN_USE_ALARM +#ifdef PA_USE_ALARM static sigjmp_buf timeout_env; static void timeout_handler(int sig){ siglongjmp(timeout_env, 1); } #endif -static int http_request( - String& response, +static int http_request(String& response, const char* host, int port, const char* request, int timeout, @@ -250,23 +249,29 @@ static int http_request( 0, "zero hostname"); //never -#ifdef WE_CAN_USE_ALARM - signal(SIGALRM, timeout_handler); +#ifdef PA_USE_ALARM + signal(SIGALRM, timeout_handler); #endif int sock=-1; - try { - int result; -#ifdef WE_CAN_USE_ALARM - if(sigsetjmp(timeout_env, 1)) - throw Exception("http.timeout", - 0, - "timeout occured while retrieving document"); - else { - alarm(timeout); +#ifdef PA_USE_ALARM + if(sigsetjmp(timeout_env, 1)) { + // stupid gcc [2.95.4] generated bad code + // which failed to handle sigsetjmp+throw: crashed inside of pre-throw code. + // rewritten simplier [though duplicating closesocket code] + if(sock>=0) + closesocket(sock); + throw Exception("http.timeout", + origin_string, + "timeout occured while retrieving document"); + return 0; // never + } else { + alarm(timeout); #endif + try { + int result; struct sockaddr_in dest; - if(!set_addr(&dest, host, port)) + if(!set_addr(&dest, host, port)) throw Exception("http.host", 0, "can not resolve hostname \"%s\"", host); @@ -287,19 +292,21 @@ static int http_request( result=http_read_response(response, sock, fail_on_status_ne_200); closesocket(sock); -#ifdef WE_CAN_USE_ALARM +#ifdef PA_USE_ALARM alarm(0); - } #endif - return result; - } catch(...) { - if(sock>=0) - closesocket(sock); -#ifdef WE_CAN_USE_ALARM - alarm(0); + return result; + } catch(...) { +#ifdef PA_USE_ALARM + alarm(0); #endif - rethrow; + if(sock>=0) + closesocket(sock); + rethrow; + } +#ifdef PA_USE_ALARM } +#endif } #ifndef DOXYGEN @@ -515,6 +522,23 @@ File_read_result file_read(Charset& char return result; } +#ifdef PA_SAFE_MODE +void check_safe_mode(stat finfo, const String& file_spec, const char* fname) { + if(finfo.st_uid/*foreign?*/!=geteuid() + && finfo.st_gid/*foreign?*/!=getegid()) + throw Exception("parser.runtime", + &file_spec, + "parser is in safe mode: " + "reading files of foreign group and user disabled " + "[recompile parser with --disable-safe-mode configure option], " + "actual filename '%s', " + "fuid(%d)!=euid(%d) or fgid(%d)!=egid(%d)", + fname, + finfo.st_uid, geteuid(), + finfo.st_gid, getegid()); +} +#endif + bool file_read_action_under_lock(const String& file_spec, const char* action_name, File_read_action action, void *context, bool as_text, @@ -547,12 +571,7 @@ bool file_read_action_under_lock(const S strerror(errno), errno, fname); #ifdef PA_SAFE_MODE - if(finfo.st_uid/*foreign?*/!=geteuid() - && finfo.st_gid/*foreign?*/!=getegid()) - throw Exception("parser.runtime", - &file_spec, - "parser is in safe mode: reading files of foreign group and user disabled [recompile parser with --disable-safe-mode configure option], actual filename '%s'", - fname); + check_safe_mode(finfo, file_spec, fname); #endif action(finfo, f, file_spec, fname, as_text, context);