X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jcc.c;h=8df9d73b41a4329243b79e978a3b60819c9396e2;hb=4fa68e2920544ec5d2585fe3e9efd65363e46032;hp=d2c894c04ab6c425923e2fe1879169bd684c13b6;hpb=55084ab600988333a56a957debf2facde59beaab;p=privoxy.git diff --git a/jcc.c b/jcc.c index d2c894c0..8df9d73b 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.363 2011/08/22 18:58:29 fabiankeil Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.369 2011/10/23 11:22:16 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -317,7 +317,7 @@ static const struct cruncher crunchers_light[] = { #if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) /********************************************************************* * - * Function : sig_handler + * Function : sig_handler * * Description : Signal handler for different signals. * Exit gracefully on TERM and INT @@ -327,7 +327,7 @@ static const struct cruncher crunchers_light[] = { * Parameters : * 1 : the_signal = the signal cause this function to call * - * Returns : - + * Returns : - * *********************************************************************/ static void sig_handler(int the_signal) @@ -350,10 +350,10 @@ static void sig_handler(int the_signal) #if defined(unix) received_hup_signal = 1; #endif - break; + break; default: - /* + /* * We shouldn't be here, unless we catch signals * in main() that we can't handle here! */ @@ -565,7 +565,7 @@ static jb_err get_server_headers(struct client_state *csp) log_error(LOG_LEVEL_HEADER, "Continue hack in da house."); continue_hack_in_da_house = 1; } - else if (*header == '\0') + else if (*header == '\0') { /* * If the header is empty, but the Continue hack @@ -723,7 +723,7 @@ static void send_crunch_response(const struct client_state *csp, struct http_res if (cgi_error_memory() != rsp) { free_http_response(rsp); - } + } return; } @@ -751,7 +751,7 @@ static int crunch_response_triggered(struct client_state *csp, const struct crun /* * If CGI request crunching is disabled, * check the CGI dispatcher out of order to - * prevent unintentional blocks or redirects. + * prevent unintentional blocks or redirects. */ if (!(csp->config->feature_flags & RUNTIME_FEATURE_CGI_CRUNCHING) && (NULL != (rsp = dispatch_cgi(csp)))) @@ -1339,7 +1339,7 @@ static jb_err receive_client_request(struct client_state *csp) destroy_list(headers); return JB_ERR_PARSE; } - + if (add_to_iob(csp, buf, len)) { /* @@ -1397,7 +1397,7 @@ static jb_err receive_client_request(struct client_state *csp) get_url_actions(csp, http); } - /* + /* * Save a copy of the original request for logging */ http->ocmd = strdup(http->cmd); @@ -1693,16 +1693,16 @@ static void chat(struct client_state *csp) } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - hdr = list_to_text(csp->headers); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header"); - } - list_remove_all(csp->headers); - if (fwd->forward_host || (http->ssl == 0)) { + hdr = list_to_text(csp->headers); + if (hdr == NULL) + { + /* FIXME Should handle error properly */ + log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header"); + } + list_remove_all(csp->headers); + /* * Write the client's (modified) header to the server * (along with anything else that may be in the buffer) @@ -1722,17 +1722,18 @@ static void chat(struct client_state *csp) freez(hdr); return; } + freez(hdr); } else { /* * We're running an SSL tunnel and we're not forwarding, - * so just send the "connect succeeded" message to the - * client, flush the rest, and get out of the way. + * so just ditch the client headers, send the "connect succeeded" + * message to the client, flush the rest, and get out of the way. */ + list_remove_all(csp->headers); if (write_socket(csp->cfd, CSUCCEED, strlen(CSUCCEED))) { - freez(hdr); return; } IOB_RESET(csp); @@ -1742,9 +1743,6 @@ static void chat(struct client_state *csp) csp->server_connection.request_sent = time(NULL); - /* we're finished with the client's header */ - freez(hdr); - maxfd = (csp->cfd > csp->server_connection.sfd) ? csp->cfd : csp->server_connection.sfd; @@ -2149,7 +2147,7 @@ static void chat(struct client_state *csp) hdr = list_to_text(csp->headers); if (hdr == NULL) { - /* + /* * Memory is too tight to even generate the header. * Send our static "Out-of-memory" page. */ @@ -2206,7 +2204,7 @@ static void chat(struct client_state *csp) { log_error(LOG_LEVEL_ERROR, "Out of memory while looking for end of server headers."); rsp = cgi_error_memory(); - send_crunch_response(csp, rsp); + send_crunch_response(csp, rsp); mark_server_socket_tainted(csp); return; } @@ -2258,7 +2256,7 @@ static void chat(struct client_state *csp) if ((csp->flags & CSP_FLAG_REUSED_CLIENT_CONNECTION)) { log_error(LOG_LEVEL_ERROR, - "Empty server or forwarder response received on socket %d. " + "No server or forwarder response received on socket %d. " "Closing client socket %d without sending data.", csp->server_connection.sfd, csp->cfd); log_error(LOG_LEVEL_CLF, @@ -2267,7 +2265,7 @@ static void chat(struct client_state *csp) else { log_error(LOG_LEVEL_ERROR, - "Empty server or forwarder response received on socket %d.", + "No server or forwarder response received on socket %d.", csp->server_connection.sfd); send_crunch_response(csp, error_response(csp, "no-server-data")); } @@ -2513,11 +2511,13 @@ static void serve(struct client_state *csp) continue_chatting = (csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && (((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE) - && !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)) - || (csp->flags & CSP_FLAG_CRUNCHED)) + && !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED) + && ((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE) + || (csp->flags & CSP_FLAG_CRUNCHED)) && (csp->cfd != JB_INVALID_SOCKET) - && (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE); + && ((csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE) + || (csp->config->feature_flags & + RUNTIME_FEATURE_CONNECTION_SHARING)); if (continue_chatting && !(csp->flags & CSP_FLAG_CRUNCHED)) { @@ -3036,7 +3036,7 @@ int main(int argc, char **argv) { char cwd[BUFFER_SIZE]; char *abs_file; - size_t abs_file_size; + size_t abs_file_size; /* make config-filename absolute here */ if (NULL == getcwd(cwd, sizeof(cwd))) @@ -3090,12 +3090,11 @@ int main(int argc, char **argv) #if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) { int idx; - const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP, 0 }; - const int ignored_signals[] = { SIGPIPE, 0 }; + const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP }; - for (idx = 0; catched_signals[idx] != 0; idx++) + for (idx = 0; idx < SZ(catched_signals); idx++) { -#ifdef sun /* FIXME: Is it safe to check for HAVE_SIGSET instead? */ +#ifdef sun /* FIXME: Is it safe to check for HAVE_SIGSET instead? */ if (sigset(catched_signals[idx], sig_handler) == SIG_ERR) #else if (signal(catched_signals[idx], sig_handler) == SIG_ERR) @@ -3105,12 +3104,9 @@ int main(int argc, char **argv) } } - for (idx = 0; ignored_signals[idx] != 0; idx++) + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { - if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR) - { - log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]); - } + log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for SIGPIPE: %E"); } } @@ -3265,7 +3261,7 @@ int main(int argc, char **argv) if (putenv(putenv_dummy) != 0) { log_error(LOG_LEVEL_FATAL, "Cannot putenv(): HOME"); - } + } snprintf(putenv_dummy, sizeof(putenv_dummy), "USER=%s", pw->pw_name); if (putenv(putenv_dummy) != 0) @@ -3286,7 +3282,7 @@ int main(int argc, char **argv) */ if (bRunAsService) { - /* Yup, so now we must attempt to establish a connection + /* Yup, so now we must attempt to establish a connection * with the service dispatcher. This will only work if this * process was launched by the service control manager to * actually run as a service. If this isn't the case, i've @@ -3682,7 +3678,7 @@ static void listen_loop(void) #if defined(AMIGA) && !defined(SELECTED_ONE_OPTION) #define SELECTED_ONE_OPTION csp->cfd = ReleaseSocket(csp->cfd, -1); - + #ifdef __amigaos4__ child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread, NP_Output, Output(), @@ -3723,7 +3719,7 @@ static void listen_loop(void) serve(csp); - /* + /* * If we've been toggled or we've blocked the request, tell Mom */ @@ -3734,7 +3730,7 @@ static void listen_loop(void) } #endif /* def FEATURE_TOGGLE */ -#ifdef FEATURE_STATISTICS +#ifdef FEATURE_STATISTICS if (csp->flags & CSP_FLAG_REJECTED) { rc |= RC_FLAG_BLOCKED; @@ -3754,7 +3750,7 @@ static void listen_loop(void) wait( &child_status ); - /* + /* * Evaluate child's return code: If the child has * - been toggled, toggle ourselves * - blocked its request, bump up the stats counter @@ -3773,7 +3769,7 @@ static void listen_loop(void) { urls_rejected++; } -#endif /* def FEATURE_STATISTICS */ +#endif /* def FEATURE_STATISTICS */ #endif /* !defined(_WIN32) && defined(__CYGWIN__) */ close_socket(csp->cfd);