X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=errlog.c;h=7cc4e200dcd938216e37b9cf7b247568e632afd2;hp=fe2ee38d0c287b174d993716c8176d3d23ffa7bf;hb=0cbd0e80bb1b4a44a11995ba3a5fd0e4757c1694;hpb=4877176b79cd08a203f3c8375418f20bdd14573d diff --git a/errlog.c b/errlog.c index fe2ee38d..7cc4e200 100644 --- a/errlog.c +++ b/errlog.c @@ -1,4 +1,3 @@ -const char errlog_rcs[] = "$Id: errlog.c,v 1.117 2012/12/09 12:28:14 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/errlog.c,v $ @@ -6,8 +5,8 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.117 2012/12/09 12:28:14 fabiankeil * Purpose : Log errors to a designated destination in an elegant, * printf-like fashion. * - * Copyright : Written by and Copyright (C) 2001-2010 the - * Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001-2014 the + * Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -75,9 +74,9 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.117 2012/12/09 12:28:14 fabiankeil #include "errlog.h" #include "project.h" #include "jcc.h" - -const char errlog_h_rcs[] = ERRLOG_H_VERSION; - +#ifdef FEATURE_EXTERNAL_FILTERS +#include "jbsockets.h" +#endif /* * LOG_LEVEL_FATAL cannot be turned off. (There are @@ -242,6 +241,17 @@ void init_log_module(void) *********************************************************************/ void set_debug_level(int debug_level) { +#ifdef FUZZ + if (LOG_LEVEL_STFU == debug_level) + { + debug = LOG_LEVEL_STFU; + } + if (LOG_LEVEL_STFU == debug) + { + return; + } +#endif + debug = debug_level | LOG_LEVEL_MINIMUM; } @@ -354,6 +364,10 @@ void init_error_log(const char *prog_name, const char *logfname) log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: \'%s\'", logfname); } +#ifdef FEATURE_EXTERNAL_FILTERS + mark_socket_for_close_on_execute(3); +#endif + /* set logging to be completely unbuffered */ setbuf(fp, NULL); @@ -402,7 +416,7 @@ void init_error_log(const char *prog_name, const char *logfname) *********************************************************************/ static long get_thread_id(void) { - long this_thread = 1; /* was: pthread_t this_thread;*/ + long this_thread; #ifdef __OS2__ PTIB ptib; @@ -414,12 +428,11 @@ static long get_thread_id(void) this_thread = (long)pthread_self(); #ifdef __MACH__ /* - * Mac OSX (and perhaps other Mach instances) doesn't have a debuggable - * value at the first 4 bytes of pthread_self()'s return value, a pthread_t. - * pthread_t is supposed to be opaque... but it's fairly random, though, so - * we make it mostly presentable. + * Mac OSX (and perhaps other Mach instances) doesn't have a unique + * value at the lowest order 4 bytes of pthread_self()'s return value, a pthread_t, + * so trim the three lowest-order bytes from the value (16^3). */ - this_thread = abs(this_thread % 1000); + this_thread = this_thread / 4096; #endif /* def __MACH__ */ #elif defined(_WIN32) this_thread = GetCurrentThreadId(); @@ -427,6 +440,9 @@ static long get_thread_id(void) ulrc = DosGetInfoBlocks(&ptib, NULL); if (ulrc == 0) this_thread = ptib -> tib_ptib2 -> tib2_ultid; +#else + /* Forking instead of threading. */ + this_thread = 1; #endif /* def FEATURE_PTHREAD */ return this_thread; @@ -517,21 +533,12 @@ static inline size_t get_clf_timestamp(char *buffer, size_t buffer_size) int tz_length = 0; time (&now); -#ifdef HAVE_GMTIME_R - gmt = *gmtime_r(&now, &gmt); -#elif defined(MUTEX_LOCKS_AVAILABLE) - privoxy_mutex_lock(&gmtime_mutex); - gmt = *gmtime(&now); - privoxy_mutex_unlock(&gmtime_mutex); -#else - gmt = *gmtime(&now); -#endif + gmt = *privoxy_gmtime_r(&now, &gmt); #ifdef HAVE_LOCALTIME_R tm_now = localtime_r(&now, &dummy); #elif defined(MUTEX_LOCKS_AVAILABLE) privoxy_mutex_lock(&localtime_mutex); tm_now = localtime(&now); - privoxy_mutex_unlock(&localtime_mutex); #else tm_now = localtime(&now); #endif @@ -540,6 +547,9 @@ static inline size_t get_clf_timestamp(char *buffer, size_t buffer_size) mins = hrs * 60 + tm_now->tm_min - gmt.tm_min; length = strftime(buffer, buffer_size, "%d/%b/%Y:%H:%M:%S ", tm_now); +#if !defined(HAVE_LOCALTIME_R) && defined(MUTEX_LOCKS_AVAILABLE) + privoxy_mutex_unlock(&localtime_mutex); +#endif if (length > (size_t)0) { @@ -585,7 +595,7 @@ static inline const char *get_log_level_string(int loglevel) case LOG_LEVEL_FATAL: log_level_string = "Fatal error"; break; - case LOG_LEVEL_GPC: + case LOG_LEVEL_REQUEST: log_level_string = "Request"; break; case LOG_LEVEL_CONNECT: @@ -654,19 +664,13 @@ static inline const char *get_log_level_string(int loglevel) void log_error(int loglevel, const char *fmt, ...) { va_list ap; - char *outbuf = NULL; - static char *outbuf_save = NULL; + char outbuf[LOG_BUFFER_SIZE+1]; char tempbuf[LOG_BUFFER_SIZE]; size_t length = 0; const char * src = fmt; long thread_id; char timestamp[30]; - /* - * XXX: Make this a config option, - * why else do we allocate instead of using - * an array? - */ - size_t log_buffer_size = LOG_BUFFER_SIZE; + const size_t log_buffer_size = LOG_BUFFER_SIZE; #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* @@ -674,7 +678,7 @@ void log_error(int loglevel, const char *fmt, ...) * the taskbar icon animate. (There is an option to disable * this but checking that is handled inside LogShowActivity()). */ - if ((loglevel == LOG_LEVEL_GPC) || (loglevel == LOG_LEVEL_CRUNCH)) + if ((loglevel == LOG_LEVEL_REQUEST) || (loglevel == LOG_LEVEL_CRUNCH)) { LogShowActivity(); } @@ -691,6 +695,12 @@ void log_error(int loglevel, const char *fmt, ...) #endif ) { +#ifdef FUZZ + if (debug == LOG_LEVEL_STFU) + { + return; + } +#endif if (loglevel == LOG_LEVEL_FATAL) { fatal_error("Fatal error. You're not supposed to" @@ -702,28 +712,11 @@ void log_error(int loglevel, const char *fmt, ...) thread_id = get_thread_id(); get_log_timestamp(timestamp, sizeof(timestamp)); - /* protect the whole function because of the static buffer (outbuf) */ - lock_logfile(); - - if (NULL == outbuf_save) - { - outbuf_save = (char*)zalloc(log_buffer_size + 1); /* +1 for paranoia */ - if (NULL == outbuf_save) - { - snprintf(tempbuf, sizeof(tempbuf), - "%s %08lx Fatal error: Out of memory in log_error().", - timestamp, thread_id); - fatal_error(tempbuf); /* Exit */ - return; - } - } - outbuf = outbuf_save; - /* * Memsetting the whole buffer to zero (in theory) * makes things easier later on. */ - memset(outbuf, 0, log_buffer_size); + memset(outbuf, 0, sizeof(outbuf)); /* Add prefix for everything but Common Log Format messages */ if (loglevel != LOG_LEVEL_CLF) @@ -800,7 +793,7 @@ void log_error(int loglevel, const char *fmt, ...) break; case 'c': /* - * Note that char paramaters are converted to int, so we need to + * Note that char parameters are converted to int, so we need to * pass "int" to va_arg. (See K&R, 2nd ed, section A7.3.2, page 202) */ tempbuf[0] = (char) va_arg(ap, int); @@ -937,19 +930,21 @@ void log_error(int loglevel, const char *fmt, ...) assert(NULL != logfp); #endif + lock_logfile(); + if (loglevel == LOG_LEVEL_FATAL) { - fatal_error(outbuf_save); + fatal_error(outbuf); /* Never get here */ } if (logfp != NULL) { - fputs(outbuf_save, logfp); + fputs(outbuf, logfp); } #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* Write to display */ - LogPutString(outbuf_save); + LogPutString(outbuf); #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ unlock_logfile(); @@ -963,17 +958,13 @@ void log_error(int loglevel, const char *fmt, ...) * * Description : Translates JB_ERR_FOO codes into strings. * - * XXX: the type of error codes is jb_err - * but the typedef'inition is currently not - * visible to all files that include errlog.h. - * * Parameters : * 1 : jb_error = a valid jb_err code * * Returns : A string with the jb_err translation * *********************************************************************/ -const char *jb_err_to_string(int jb_error) +const char *jb_err_to_string(jb_err jb_error) { switch (jb_error) { @@ -991,9 +982,6 @@ const char *jb_err_to_string(int jb_error) return "File has been modified outside of the CGI actions editor."; case JB_ERR_COMPRESS: return "(De)compression failure"; - default: - assert(0); - return "Unknown error"; } assert(0); return "Internal error";