X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jcc.c;h=face11b511d2be7557868d0c684640350b9df99f;hb=30dab240148066218231d5d1649c8621fff009d7;hp=1457206bd23bc60b901588c56150ce69d398fcfa;hpb=5d8157f124797e48de72ebab4cd74d2c40bccdd8;p=privoxy.git diff --git a/jcc.c b/jcc.c index 1457206b..face11b5 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.370 2011/10/23 11:23:35 fabiankeil Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.381 2012/07/23 12:40:52 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -338,7 +338,7 @@ static void sig_handler(int the_signal) case SIGINT: log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal); #if defined(unix) - if(pidfile) + if (pidfile) { unlink(pidfile); } @@ -823,16 +823,11 @@ static void build_request_line(struct client_state *csp, const struct forward_sp * Downgrade http version from 1.1 to 1.0 * if +downgrade action applies. */ - if ( (csp->action->flags & ACTION_DOWNGRADE) + if ((csp->action->flags & ACTION_DOWNGRADE) && (!strcmpic(http->ver, "HTTP/1.1"))) { freez(http->ver); - http->ver = strdup("HTTP/1.0"); - - if (http->ver == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version"); - } + http->ver = strdup_or_die("HTTP/1.0"); } /* @@ -891,12 +886,7 @@ static jb_err change_request_destination(struct client_state *csp) else { /* XXX: ocmd is a misleading name */ - http->ocmd = strdup(http->cmd); - if (http->ocmd == NULL) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory copying rewritten HTTP request line"); - } + http->ocmd = strdup_or_die(http->cmd); } return err; @@ -1003,11 +993,7 @@ void save_connection_destination(jb_socket sfd, assert(NULL != http->host); server_connection->sfd = sfd; - server_connection->host = strdup(http->host); - if (NULL == server_connection->host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving socket."); - } + server_connection->host = strdup_or_die(http->host); server_connection->port = http->port; assert(NULL != fwd); @@ -1020,11 +1006,7 @@ void save_connection_destination(jb_socket sfd, server_connection->forwarder_type = fwd->type; if (NULL != fwd->gateway_host) { - server_connection->gateway_host = strdup(fwd->gateway_host); - if (NULL == server_connection->gateway_host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving gateway_host."); - } + server_connection->gateway_host = strdup_or_die(fwd->gateway_host); } else { @@ -1034,11 +1016,7 @@ void save_connection_destination(jb_socket sfd, if (NULL != fwd->forward_host) { - server_connection->forward_host = strdup(fwd->forward_host); - if (NULL == server_connection->forward_host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving forward_host."); - } + server_connection->forward_host = strdup_or_die(fwd->forward_host); } else { @@ -1193,11 +1171,20 @@ static char *get_request_line(struct client_state *csp) { if (!data_is_available(csp->cfd, csp->config->socket_timeout)) { - log_error(LOG_LEVEL_CONNECT, - "Stopped waiting for the request line. Timeout: %d.", - csp->config->socket_timeout); - write_socket(csp->cfd, CLIENT_CONNECTION_TIMEOUT_RESPONSE, - strlen(CLIENT_CONNECTION_TIMEOUT_RESPONSE)); + if (socket_is_still_alive(csp->cfd)) + { + log_error(LOG_LEVEL_CONNECT, + "No request line on socket %d received in time. Timeout: %d.", + csp->cfd, csp->config->socket_timeout); + write_socket(csp->cfd, CLIENT_CONNECTION_TIMEOUT_RESPONSE, + strlen(CLIENT_CONNECTION_TIMEOUT_RESPONSE)); + } + else + { + log_error(LOG_LEVEL_CONNECT, + "The client side of the connection on socket %d got " + "closed without sending a complete request line.", csp->cfd); + } return NULL; } @@ -1230,10 +1217,6 @@ static char *get_request_line(struct client_state *csp) * Description : Read the client's request (more precisely the * client headers) and answer it if necessary. * - * Note that since we're not using select() we could get - * blocked here if a client connected, then didn't say - * anything! - * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * @@ -1400,12 +1383,7 @@ static jb_err receive_client_request(struct client_state *csp) /* * Save a copy of the original request for logging */ - http->ocmd = strdup(http->cmd); - if (http->ocmd == NULL) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory copying HTTP request line"); - } + http->ocmd = strdup_or_die(http->cmd); enlist(csp->headers, http->cmd); /* Append the previously read headers */ @@ -1865,8 +1843,9 @@ static void chat(struct client_state *csp) */ watch_client_socket = 0; log_error(LOG_LEVEL_CONNECT, - "Stopping to watch the client socket. " - "There's already another request waiting."); + "Stopping to watch the client socket %d. " + "There's already another request waiting.", + csp->cfd); continue; } /* @@ -2444,6 +2423,8 @@ static void chat(struct client_state *csp) *********************************************************************/ static void prepare_csp_for_next_request(struct client_state *csp) { + unsigned int toggled_on_flag_set = (0 != (csp->flags & CSP_FLAG_TOGGLED_ON)); + csp->content_type = 0; csp->content_length = 0; csp->expected_content_length = 0; @@ -2462,9 +2443,11 @@ static void prepare_csp_for_next_request(struct client_state *csp) csp->fwd = NULL; } /* XXX: Store per-connection flags someplace else. */ - csp->flags &= CSP_FLAG_TOGGLED_ON; - csp->flags |= CSP_FLAG_ACTIVE; - csp->flags |= CSP_FLAG_REUSED_CLIENT_CONNECTION; + csp->flags = (CSP_FLAG_ACTIVE | CSP_FLAG_REUSED_CLIENT_CONNECTION); + if (toggled_on_flag_set) + { + csp->flags |= CSP_FLAG_TOGGLED_ON; + } } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ @@ -2847,6 +2830,7 @@ static void initialize_mutexes(void) #ifndef HAVE_RANDOM privoxy_mutex_init(&rand_mutex); #endif /* ndef HAVE_RANDOM */ + #endif /* def MUTEX_LOCKS_AVAILABLE */ } @@ -2921,7 +2905,7 @@ int main(int argc, char **argv) const char *pName = argv[argc_pos] + 9; if (*pName == ':') pName++; - exit( (install_service(pName)) ? 0 : 1 ); + exit((install_service(pName)) ? 0 : 1); } else if (strncmp(argv[argc_pos], "--uninstall", 11) == 0) { @@ -2930,7 +2914,7 @@ int main(int argc, char **argv) pName++; exit((uninstall_service(pName)) ? 0 : 1); } - else if (strcmp(argv[argc_pos], "--service" ) == 0) + else if (strcmp(argv[argc_pos], "--service") == 0) { bRunAsService = TRUE; w32_set_service_cwd(); @@ -2947,7 +2931,7 @@ int main(int argc, char **argv) usage(argv[0]); } - else if(strcmp(argv[argc_pos], "--version") == 0) + else if (strcmp(argv[argc_pos], "--version") == 0) { printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n"); exit(0); @@ -2955,31 +2939,26 @@ int main(int argc, char **argv) #if defined(unix) - else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0) + else if (strcmp(argv[argc_pos], "--no-daemon") == 0) { set_debug_level(LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO); daemon_mode = 0; } - else if (strcmp(argv[argc_pos], "--pidfile" ) == 0) + else if (strcmp(argv[argc_pos], "--pidfile") == 0) { if (++argc_pos == argc) usage(argv[0]); - pidfile = strdup(argv[argc_pos]); + pidfile = strdup_or_die(argv[argc_pos]); } - else if (strcmp(argv[argc_pos], "--user" ) == 0) + else if (strcmp(argv[argc_pos], "--user") == 0) { char *user_arg; char *group_name; if (++argc_pos == argc) usage(argv[argc_pos]); - user_arg = strdup(argv[argc_pos]); - if (NULL == user_arg) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory splitting --user argument '%s'.", argv[argc_pos]); - } + user_arg = strdup_or_die(argv[argc_pos]); group_name = strchr(user_arg, '.'); if (NULL != group_name) { @@ -3004,13 +2983,13 @@ int main(int argc, char **argv) freez(user_arg); } - else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup" ) == 0) + else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup") == 0) { if (++argc_pos == argc) usage(argv[0]); - pre_chroot_nslookup_to_load_resolver = strdup(argv[argc_pos]); + pre_chroot_nslookup_to_load_resolver = strdup_or_die(argv[argc_pos]); } - else if (strcmp(argv[argc_pos], "--chroot" ) == 0) + else if (strcmp(argv[argc_pos], "--chroot") == 0) { do_chroot = 1; } @@ -3037,7 +3016,7 @@ int main(int argc, char **argv) show_version(Argv[0]); #if defined(unix) - if ( *configfile != '/' ) + if (*configfile != '/') { char cwd[BUFFER_SIZE]; char *abs_file; @@ -3047,21 +3026,15 @@ int main(int argc, char **argv) if (NULL == getcwd(cwd, sizeof(cwd))) { perror("failed to get current working directory"); - exit( 1 ); + exit(1); } + basedir = strdup_or_die(cwd); /* XXX: why + 5? */ abs_file_size = strlen(cwd) + strlen(configfile) + 5; - basedir = strdup(cwd); - - if (NULL == basedir || - NULL == (abs_file = malloc(abs_file_size))) - { - perror("malloc failed"); - exit( 1 ); - } + abs_file = malloc_or_die(abs_file_size); strlcpy(abs_file, basedir, abs_file_size); - strlcat(abs_file, "/", abs_file_size ); + strlcat(abs_file, "/", abs_file_size); strlcat(abs_file, configfile, abs_file_size); configfile = abs_file; } @@ -3141,12 +3114,12 @@ int main(int argc, char **argv) int fd; pid_t pid = fork(); - if ( pid < 0 ) /* error */ + if (pid < 0) /* error */ { perror("fork"); - exit( 3 ); + exit(3); } - else if ( pid != 0 ) /* parent */ + else if (pid != 0) /* parent */ { int status; pid_t wpid; @@ -3154,13 +3127,13 @@ int main(int argc, char **argv) * must check for errors * child died due to missing files aso */ - sleep( 1 ); - wpid = waitpid( pid, &status, WNOHANG ); - if ( wpid != 0 ) + sleep(1); + wpid = waitpid(pid, &status, WNOHANG); + if (wpid != 0) { - exit( 1 ); + exit(1); } - exit( 0 ); + exit(0); } /* child */ @@ -3220,12 +3193,9 @@ int main(int argc, char **argv) { log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions."); } - if (NULL != grp) + if ((NULL != grp) && setgroups(1, &grp->gr_gid)) { - if (setgroups(1, &grp->gr_gid)) - { - log_error(LOG_LEVEL_FATAL, "setgroups() failed: %E"); - } + log_error(LOG_LEVEL_FATAL, "setgroups() failed: %E"); } else if (initgroups(pw->pw_name, pw->pw_gid)) { @@ -3540,7 +3510,7 @@ static void listen_loop(void) log_error(LOG_LEVEL_CONNECT, "accept failed: %E"); #ifdef AMIGA - if(!childs) + if (!childs) { exit(1); } @@ -3699,7 +3669,7 @@ static void listen_loop(void) NP_StackSize, 200*1024, TAG_DONE); #endif - if(0 != child_id) + if (0 != child_id) { childs++; ((struct Task *)child_id)->tc_UserData = csp; @@ -3753,7 +3723,7 @@ static void listen_loop(void) int child_status; #if !defined(_WIN32) && !defined(__CYGWIN__) - wait( &child_status ); + wait(&child_status); /* * Evaluate child's return code: If the child has