X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jcc.c;h=534906605ebb974a52ebcb32405cf13f2872179b;hp=4f691862be350163c8dc3a0416b8730ea5025ad9;hb=58b046286114445ac83e0838be9b6e0fa188a108;hpb=52cf256c05896e5e82b9cac9afbaee41c9c597ab diff --git a/jcc.c b/jcc.c index 4f691862..53490660 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.339 2011/01/09 12:08:04 fabiankeil Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.350 2011/04/26 16:55:08 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -1352,7 +1352,7 @@ static jb_err receive_client_request(struct client_state *csp) { /* * We were able to read a complete - * header and can finaly enlist it. + * header and can finally enlist it. */ enlist(headers, p); freez(p); @@ -1495,7 +1495,7 @@ static jb_err parse_client_request(struct client_state *csp) * this function is called (via serve()) to handle the * main business of the communication. This function * returns after dealing with a single request. It can - * be called multiple times witht the same client socket + * be called multiple times with the same client socket * if the client is keeping the connection alive. * * The decision whether or not a client connection will @@ -1522,8 +1522,6 @@ static void chat(struct client_state *csp) int server_body; int ms_iis5_hack = 0; unsigned long long byte_count = 0; - int forwarded_connect_retries = 0; - int max_forwarded_connect_retries = csp->config->forwarded_connect_retries; const struct forward_spec *fwd; struct http_request *http; long len = 0; /* for buffer sizes (and negative error codes) */ @@ -1601,8 +1599,8 @@ static void chat(struct client_state *csp) csp->action->string[ACTION_STRING_LIMIT_CONNECT]; assert(NULL != acceptable_connect_ports); log_error(LOG_LEVEL_INFO, "Request from %s marked for blocking. " - "limit-connect{%s} doesn't allow CONNECT requests to port %d.", - csp->ip_addr_str, acceptable_connect_ports, csp->http->port); + "limit-connect{%s} doesn't allow CONNECT requests to %s", + csp->ip_addr_str, acceptable_connect_ports, csp->http->hostport); csp->action->flags |= ACTION_BLOCK; http->ssl = 0; } @@ -1659,14 +1657,7 @@ static void chat(struct client_state *csp) } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - while ((csp->server_connection.sfd = forwarded_connect(fwd, http, csp)) - && (errno == EINVAL) - && (forwarded_connect_retries++ < max_forwarded_connect_retries)) - { - log_error(LOG_LEVEL_ERROR, - "failed request #%u to connect to %s. Trying again.", - forwarded_connect_retries, http->hostport); - } + csp->server_connection.sfd = forwarded_connect(fwd, http, csp); if (csp->server_connection.sfd == JB_INVALID_SOCKET) { @@ -1682,8 +1673,6 @@ static void chat(struct client_state *csp) else { rsp = error_response(csp, "connect-failed"); - log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E", - http->hostport); } /* Write the answer to the client */ @@ -2510,7 +2499,8 @@ static void serve(struct client_state *csp) && (((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE) && !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)) || (csp->flags & CSP_FLAG_CRUNCHED)) - && (csp->cfd != JB_INVALID_SOCKET); + && (csp->cfd != JB_INVALID_SOCKET) + && (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE); if (continue_chatting && !(csp->flags & CSP_FLAG_CRUNCHED)) { @@ -2873,7 +2863,6 @@ int main(int argc, char **argv) #ifdef unix struct passwd *pw = NULL; struct group *grp = NULL; - char *p; int do_chroot = 0; char *pre_chroot_nslookup_to_load_resolver = NULL; #endif @@ -2958,23 +2947,39 @@ int main(int argc, char **argv) else if (strcmp(argv[argc_pos], "--user" ) == 0) { + char *user_arg; + char *group_name; + if (++argc_pos == argc) usage(argv[argc_pos]); - if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0') + user_arg = strdup(argv[argc_pos]); + if (NULL == user_arg) { - *p++ = '\0'; - if (NULL == (grp = getgrnam(p))) + log_error(LOG_LEVEL_FATAL, + "Out of memory splitting --user argument '%s'.", argv[argc_pos]); + } + group_name = strchr(user_arg, '.'); + if (NULL != group_name) + { + /* Nul-terminate the user name */ + *group_name = '\0'; + + /* Skip the former delimiter to actually reach the group name */ + group_name++; + + grp = getgrnam(group_name); + if (NULL == grp) { - log_error(LOG_LEVEL_FATAL, "Group %s not found.", p); + log_error(LOG_LEVEL_FATAL, "Group '%s' not found.", group_name); } } - - if (NULL == (pw = getpwnam(argv[argc_pos]))) + pw = getpwnam(user_arg); + if (NULL == pw) { - log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]); + log_error(LOG_LEVEL_FATAL, "User '%s' not found.", user_arg); } - if (p != NULL) *--p = '\0'; + freez(user_arg); } else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup" ) == 0) @@ -3537,7 +3542,7 @@ static void listen_loop(void) { int child_id; -/* this is a switch () statment in the C preprocessor - ugh */ +/* this is a switch () statement in the C preprocessor - ugh */ #undef SELECTED_ONE_OPTION /* Use Pthreads in preference to native code */ @@ -3750,7 +3755,6 @@ static void listen_loop(void) #if defined(unix) freez(basedir); #endif - freez(configfile); #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* Cleanup - remove taskbar icon etc. */