X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jcc.c;h=ba0ecea999936b1c5ab80a048d9e7bed7dd10ce1;hp=3bbacd15fba45e41a37357f544d0471ea5a36480;hb=e91792c88ad0ba79c08a640e3d1e4830a58bc8be;hpb=84ee09b204158e3b3e4062f5d4bb3faccf7a4e0c diff --git a/jcc.c b/jcc.c index 3bbacd15..ba0ecea9 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,3 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.468 2017/08/12 09:33:25 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -128,9 +127,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.468 2017/08/12 09:33:25 fabiankeil Exp $" #include "client-tags.h" #endif -const char jcc_h_rcs[] = JCC_H_VERSION; -const char project_h_rcs[] = PROJECT_H_VERSION; - int daemon_mode = 1; struct client_states clients[1]; struct file_list files[1]; @@ -144,7 +140,7 @@ int urls_rejected = 0; /* total nr of urls rejected */ int g_terminate = 0; #endif -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) +#if !defined(_WIN32) && !defined(__OS2__) static void sig_handler(int the_signal); #endif static int client_protocol_is_unsupported(const struct client_state *csp, char *req); @@ -167,12 +163,7 @@ static jb_socket bind_port_helper(const char *haddr, int hport, int backlog); static void bind_ports_helper(struct configuration_spec *config, jb_socket sockets[]); static void close_ports_helper(jb_socket sockets[]); static void listen_loop(void); - -#ifdef AMIGA -void serve(struct client_state *csp); -#else /* ifndef AMIGA */ static void serve(struct client_state *csp); -#endif /* def AMIGA */ #ifdef __BEOS__ static int32 server_thread(void *data); @@ -343,7 +334,7 @@ static const struct cruncher crunchers_light[] = { * * here? */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) +#if !defined(_WIN32) && !defined(__OS2__) /********************************************************************* * * Function : sig_handler @@ -762,7 +753,7 @@ static void log_applied_actions(const struct current_action_spec *actions) * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) - * 1 : rsp = Fully prepared response. Will be freed on exit. + * 2 : rsp = Fully prepared response. Will be freed on exit. * * Returns : Nothing. * @@ -1069,7 +1060,7 @@ static void wait_for_alive_connections(void) * 1 : sfd = Open socket to remember. * 2 : http = The destination for the connection. * 3 : fwd = The forwarder settings used. - * 3 : server_connection = storage. + * 4 : server_connection = storage. * * Returns : void * @@ -1966,7 +1957,6 @@ static int send_http_request(struct client_state *csp) *********************************************************************/ static void handle_established_connection(struct client_state *csp) { - char *receive_buffer; char *hdr; char *p; int n; @@ -1989,10 +1979,10 @@ static void handle_established_connection(struct client_state *csp) #ifdef FEATURE_CONNECTION_KEEP_ALIVE int watch_client_socket; #endif - const size_t receive_buffer_size = csp->config->receive_buffer_size; - receive_buffer = zalloc(receive_buffer_size + 1); - if (receive_buffer == NULL) + csp->receive_buffer_size = csp->config->receive_buffer_size; + csp->receive_buffer = zalloc(csp->receive_buffer_size + 1); + if (csp->receive_buffer == NULL) { log_error(LOG_LEVEL_ERROR, "Out of memory. Failed to allocate the receive buffer."); @@ -2123,7 +2113,6 @@ static void handle_established_connection(struct client_state *csp) send_crunch_response(csp, error_response(csp, "connection-timeout")); } mark_server_socket_tainted(csp); - freez(receive_buffer); return; } else if (n < 0) @@ -2134,7 +2123,6 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); #endif mark_server_socket_tainted(csp); - freez(receive_buffer); return; } @@ -2161,7 +2149,7 @@ static void handle_established_connection(struct client_state *csp) if (FD_ISSET(csp->cfd, &rfds)) #endif /* def HAVE_POLL*/ { - int max_bytes_to_read = (int)receive_buffer_size; + int max_bytes_to_read = (int)csp->receive_buffer_size; #ifdef FEATURE_CONNECTION_KEEP_ALIVE if ((csp->flags & CSP_FLAG_CLIENT_REQUEST_COMPLETELY_READ)) @@ -2176,7 +2164,7 @@ static void handle_established_connection(struct client_state *csp) */ watch_client_socket = 0; log_error(LOG_LEVEL_CONNECT, - "Stopping to watch the client socket %d. " + "Stop watching client socket %d. " "There's already another request waiting.", csp->cfd); continue; @@ -2195,7 +2183,7 @@ static void handle_established_connection(struct client_state *csp) } if (csp->expected_client_content_length != 0) { - if (csp->expected_client_content_length < receive_buffer_size) + if (csp->expected_client_content_length < csp->receive_buffer_size) { max_bytes_to_read = (int)csp->expected_client_content_length; } @@ -2203,10 +2191,10 @@ static void handle_established_connection(struct client_state *csp) "Waiting for up to %d bytes from the client.", max_bytes_to_read); } - assert(max_bytes_to_read <= receive_buffer_size); + assert(max_bytes_to_read <= csp->receive_buffer_size); #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - len = read_socket(csp->cfd, receive_buffer, max_bytes_to_read); + len = read_socket(csp->cfd, csp->receive_buffer, max_bytes_to_read); if (len <= 0) { @@ -2233,11 +2221,10 @@ static void handle_established_connection(struct client_state *csp) } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - if (write_socket(csp->server_connection.sfd, receive_buffer, (size_t)len)) + if (write_socket(csp->server_connection.sfd, csp->receive_buffer, (size_t)len)) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } continue; @@ -2271,13 +2258,12 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_CONNECT, "The server still wants to talk, but the client hung up on us."); mark_server_socket_tainted(csp); - freez(receive_buffer); return; #endif /* def _WIN32 */ } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - len = read_socket(csp->server_connection.sfd, receive_buffer, (int)receive_buffer_size); + len = read_socket(csp->server_connection.sfd, csp->receive_buffer, (int)csp->receive_buffer_size); if (len < 0) { @@ -2292,7 +2278,6 @@ static void handle_established_connection(struct client_state *csp) */ log_error(LOG_LEVEL_ERROR, "CONNECT already confirmed. Unable to tell the client about the problem."); - freez(receive_buffer); return; } else if (byte_count) @@ -2307,7 +2292,6 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "Already forwarded the original headers. " "Unable to tell the client about the problem."); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } /* @@ -2320,7 +2304,7 @@ static void handle_established_connection(struct client_state *csp) #ifdef FEATURE_CONNECTION_KEEP_ALIVE if (csp->flags & CSP_FLAG_CHUNKED) { - if ((len >= 5) && !memcmp(receive_buffer+len-5, "0\r\n\r\n", 5)) + if ((len >= 5) && !memcmp(csp->receive_buffer+len-5, "0\r\n\r\n", 5)) { /* XXX: this is a temporary hack */ log_error(LOG_LEVEL_CONNECT, @@ -2337,19 +2321,19 @@ static void handle_established_connection(struct client_state *csp) * This is guaranteed by allocating with zalloc_or_die() * and never (intentionally) writing to the last byte. * - * receive_buffer_size is the size of the part of the + * csp->receive_buffer_size is the size of the part of the * buffer we intentionally write to, but we actually - * allocated receive_buffer_size+1 bytes so the assertion + * allocated csp->receive_buffer_size+1 bytes so the assertion * stays within the allocated range. */ - assert(receive_buffer[receive_buffer_size] == '\0'); + assert(csp->receive_buffer[csp->receive_buffer_size] == '\0'); /* * Add a trailing zero to let be able to use string operations. * XXX: do we still need this with filter_popups gone? */ - assert(len <= receive_buffer_size); - receive_buffer[len] = '\0'; + assert(len <= csp->receive_buffer_size); + csp->receive_buffer[len] = '\0'; /* * Normally, this would indicate that we've read @@ -2428,7 +2412,6 @@ static void handle_established_connection(struct client_state *csp) freez(hdr); freez(p); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } @@ -2443,8 +2426,8 @@ static void handle_established_connection(struct client_state *csp) * This is NOT the body, so * Let's pretend the server just sent us a blank line. */ - snprintf(receive_buffer, receive_buffer_size, "\r\n"); - len = (int)strlen(receive_buffer); + snprintf(csp->receive_buffer, csp->receive_buffer_size, "\r\n"); + len = (int)strlen(csp->receive_buffer); /* * Now, let the normal header parsing algorithm below do its @@ -2468,7 +2451,7 @@ static void handle_established_connection(struct client_state *csp) * has been reached, switch to non-filtering mode, i.e. make & write the * header, flush the iob and buf, and get out of the way. */ - if (add_to_iob(csp->iob, csp->config->buffer_limit, receive_buffer, len)) + if (add_to_iob(csp->iob, csp->config->buffer_limit, csp->receive_buffer, len)) { size_t hdrlen; long flushed; @@ -2487,20 +2470,18 @@ static void handle_established_connection(struct client_state *csp) rsp = cgi_error_memory(); send_crunch_response(csp, rsp); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } hdrlen = strlen(hdr); if (write_socket(csp->cfd, hdr, hdrlen) || ((flushed = flush_socket(csp->cfd, csp->iob)) < 0) - || (write_socket(csp->cfd, receive_buffer, (size_t)len))) + || (write_socket(csp->cfd, csp->receive_buffer, (size_t)len))) { log_error(LOG_LEVEL_CONNECT, "Flush header and buffers to client failed: %E"); freez(hdr); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } @@ -2517,11 +2498,10 @@ static void handle_established_connection(struct client_state *csp) } else { - if (write_socket(csp->cfd, receive_buffer, (size_t)len)) + if (write_socket(csp->cfd, csp->receive_buffer, (size_t)len)) { log_error(LOG_LEVEL_ERROR, "write to client failed: %E"); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } } @@ -2535,13 +2515,12 @@ static void handle_established_connection(struct client_state *csp) * Buffer up the data we just read. If that fails, there's * little we can do but send our static out-of-memory page. */ - if (add_to_iob(csp->iob, csp->config->buffer_limit, receive_buffer, len)) + if (add_to_iob(csp->iob, csp->config->buffer_limit, csp->receive_buffer, len)) { log_error(LOG_LEVEL_ERROR, "Out of memory while looking for end of server headers."); rsp = cgi_error_memory(); send_crunch_response(csp, rsp); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } @@ -2562,7 +2541,6 @@ static void handle_established_connection(struct client_state *csp) write_socket(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, strlen(INVALID_SERVER_HEADERS_RESPONSE)); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } else @@ -2608,7 +2586,6 @@ static void handle_established_connection(struct client_state *csp) } free_http_request(http); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } @@ -2649,7 +2626,6 @@ static void handle_established_connection(struct client_state *csp) strlen(INVALID_SERVER_HEADERS_RESPONSE)); free_http_request(http); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } hdr = list_to_text(csp->headers); @@ -2684,7 +2660,6 @@ static void handle_established_connection(struct client_state *csp) */ freez(hdr); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } /* Buffer and pcrs filter this if appropriate. */ @@ -2715,7 +2690,6 @@ static void handle_established_connection(struct client_state *csp) */ freez(hdr); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } } @@ -2740,17 +2714,14 @@ static void handle_established_connection(struct client_state *csp) write_socket(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, strlen(INVALID_SERVER_HEADERS_RESPONSE)); mark_server_socket_tainted(csp); - freez(receive_buffer); return; } } continue; } mark_server_socket_tainted(csp); - freez(receive_buffer); return; /* huh? we should never get here */ } - freez(receive_buffer); if (csp->content_length == 0) { @@ -3032,6 +3003,7 @@ static void chat(struct client_state *csp) csp->server_connection.request_sent = time(NULL); handle_established_connection(csp); + freez(csp->receive_buffer); } @@ -3090,6 +3062,7 @@ extern int fuzz_server_response(struct client_state *csp, char *fuzz_input_file) cgi_init_error_messages(); handle_established_connection(csp); + freez(csp->receive_buffer); return 0; } @@ -3188,11 +3161,7 @@ static void prepare_csp_for_next_request(struct client_state *csp) * Returns : N/A * *********************************************************************/ -#ifdef AMIGA -void serve(struct client_state *csp) -#else /* ifndef AMIGA */ static void serve(struct client_state *csp) -#endif /* def AMIGA */ { int config_file_change_detected = 0; /* Only used for debugging */ #ifdef FEATURE_CONNECTION_KEEP_ALIVE @@ -3837,9 +3806,7 @@ int main(int argc, char **argv) clients->next = NULL; /* XXX: factor out initialising after the next stable release. */ -#ifdef AMIGA - InitAmiga(); -#elif defined(_WIN32) +#ifdef _WIN32 InitWin32(); #endif @@ -3862,7 +3829,7 @@ int main(int argc, char **argv) * are handled when and where they occur without relying * on a signal. */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) +#if !defined(_WIN32) && !defined(__OS2__) { int idx; const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP }; @@ -4003,8 +3970,10 @@ int main(int argc, char **argv) * As soon as we have written the PID file, we can switch * to the user and group ID indicated by the --user option */ - write_pid_file(); - + if (pidfile != NULL) + { + write_pid_file(pidfile); + } if (NULL != pw) { if (setgid((NULL != grp) ? grp->gr_gid : pw->pw_gid)) @@ -4322,12 +4291,12 @@ static void listen_loop(void) for (;;) #endif { -#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) while (waitpid(-1, NULL, WNOHANG) > 0) { /* zombie children */ } -#endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ +#endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) */ /* * Free data that was used by died threads @@ -4364,13 +4333,6 @@ static void listen_loop(void) if (!accept_connection(csp, bfds)) { log_error(LOG_LEVEL_CONNECT, "accept failed: %E"); - -#ifdef AMIGA - if (!childs) - { - exit(1); - } -#endif freez(csp_list); continue; } @@ -4499,34 +4461,6 @@ static void listen_loop(void) } #endif -#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(), - NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", - NP_Child, TRUE, - TAG_DONE); -#else - child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread, - NP_Output, Output(), - NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", - NP_StackSize, 200*1024, - TAG_DONE); -#endif - if (0 != child_id) - { - childs++; - ((struct Task *)child_id)->tc_UserData = csp; - Signal((struct Task *)child_id, SIGF_SINGLE); - Wait(SIGF_SINGLE); - } -#endif - #if !defined(SELECTED_ONE_OPTION) child_id = fork();