X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=jcc.c;h=f142996e177a5dfc0edb3b919428d283708330a2;hb=4490d451f9b61baada414233897a83ec8d9908aa;hp=e18132d49aa195cec2e804f34e9e6e681a8c4d69;hpb=15e6416d9fee24c73f17413a937dd1fb58240b94;p=privoxy.git diff --git a/jcc.c b/jcc.c index e18132d4..f142996e 100644 --- a/jcc.c +++ b/jcc.c @@ -5,7 +5,7 @@ * Purpose : Main file. Contains main() method, main loop, and * the main connection-handling function. * - * Copyright : Written by and Copyright (C) 2001-2019 the + * Copyright : Written by and Copyright (C) 2001-2020 the * Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -112,7 +112,7 @@ #include "project.h" #include "list.h" #include "jcc.h" -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION #include "ssl.h" #endif #include "filters.h" @@ -193,12 +193,10 @@ privoxy_mutex_t log_mutex; privoxy_mutex_t log_init_mutex; privoxy_mutex_t connection_reuse_mutex; -#ifdef LIMIT_MUTEX_NUMBER -privoxy_mutex_t certificates_mutexes[32]; -#else -privoxy_mutex_t certificates_mutexes[65536]; -#endif /* LIMIT_MUTEX_NUMBER */ +#ifdef FEATURE_HTTPS_INSPECTION +privoxy_mutex_t certificate_mutex; privoxy_mutex_t rng_mutex; +#endif #ifdef FEATURE_EXTERNAL_FILTERS privoxy_mutex_t external_filter_mutex; @@ -844,7 +842,7 @@ static void send_crunch_response(struct client_state *csp, struct http_response csp->ip_addr_str, http->ocmd, status_code, rsp->content_length); /* Write the answer to the client */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION if (client_use_ssl(csp)) { if ((ssl_send_data(&(csp->mbedtls_client_attr.ssl), @@ -2014,7 +2012,7 @@ static int send_http_request(struct client_state *csp) } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /********************************************************************* * * Function : receive_and_send_encrypted_post_data @@ -2030,12 +2028,23 @@ static int send_http_request(struct client_state *csp) *********************************************************************/ static jb_err receive_and_send_encrypted_post_data(struct client_state *csp) { - unsigned char buf[BUFFER_SIZE]; - int len; + int content_length_known = csp->expected_client_content_length != 0; while (is_ssl_pending(&(csp->mbedtls_client_attr.ssl))) { - len = ssl_recv_data(&(csp->mbedtls_client_attr.ssl), buf, sizeof(buf)); + unsigned char buf[BUFFER_SIZE]; + int len; + int max_bytes_to_read = sizeof(buf); + + if (content_length_known && csp->expected_client_content_length < sizeof(buf)) + { + max_bytes_to_read = (int)csp->expected_client_content_length; + } + log_error(LOG_LEVEL_CONNECT, + "Waiting for up to %d bytes of POST data from the client.", + max_bytes_to_read); + len = ssl_recv_data(&(csp->mbedtls_client_attr.ssl), buf, + (unsigned)max_bytes_to_read); if (len == -1) { return 1; @@ -2058,6 +2067,11 @@ static jb_err receive_and_send_encrypted_post_data(struct client_state *csp) { csp->expected_client_content_length -= (unsigned)len; } + if (csp->expected_client_content_length == 0) + { + log_error(LOG_LEVEL_HEADER, "Forwarded the last %d bytes", len); + break; + } } } @@ -2313,18 +2327,11 @@ static jb_err process_encrypted_request(struct client_state *csp) init_domain_components(csp->http); #endif - /* - * Determine the actions for this URL - */ #ifdef FEATURE_TOGGLE - if (!(csp->flags & CSP_FLAG_TOGGLED_ON)) - { - /* Most compatible set of actions (i.e. none) */ - init_current_action(csp->action); - } - else -#endif /* ndef FEATURE_TOGGLE */ + if ((csp->flags & CSP_FLAG_TOGGLED_ON) != 0) +#endif { + /* Determine the actions for this URL */ get_url_actions(csp, csp->http); } @@ -2358,6 +2365,7 @@ static jb_err process_encrypted_request(struct client_state *csp) } log_error(LOG_LEVEL_HEADER, "Encrypted request processed"); + log_applied_actions(csp->action); return err; @@ -2397,19 +2405,12 @@ static void handle_established_connection(struct client_state *csp) long len = 0; /* for buffer sizes (and negative error codes) */ int buffer_and_filter_content = 0; unsigned int write_delay; -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION int ret = 0; int use_ssl_tunnel = 0; csp->dont_verify_certificate = 0; - /* - * Preset flags informing if SSL connections with server or client - * are opened or closed - */ - csp->ssl_with_server_is_opened = 0; - csp->ssl_with_client_is_opened = 0; - - if (csp->http->ssl && !(csp->action->flags & ACTION_ENABLE_HTTPS_FILTER)) + if (csp->http->ssl && !(csp->action->flags & ACTION_HTTPS_INSPECTION)) { /* Pass encrypted content without filtering. */ use_ssl_tunnel = 1; @@ -2520,27 +2521,6 @@ static void handle_established_connection(struct client_state *csp) } #endif /* FEATURE_CONNECTION_KEEP_ALIVE */ -#ifdef FEATURE_HTTPS_FILTERING - /* - * Test if some data from client or destination server are pending - * on TLS/SSL. We must work with them preferably. TLS/SSL data can - * be pending because of maximal fragment size. - */ - int read_ssl_server = 0; - int read_ssl_client = 0; - - if (client_use_ssl(csp)) - { - read_ssl_client = is_ssl_pending(&(csp->mbedtls_client_attr.ssl)) != 0; - } - - if (server_use_ssl(csp)) - { - read_ssl_server = is_ssl_pending(&(csp->mbedtls_server_attr.ssl)) != 0; - } - - if (!read_ssl_server && !read_ssl_client) -#endif { #ifdef HAVE_POLL poll_fds[0].fd = csp->cfd; @@ -2579,7 +2559,7 @@ static void handle_established_connection(struct client_state *csp) send_crunch_response(csp, error_response(csp, "connection-timeout")); } mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -2592,42 +2572,13 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); #endif mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; } } -#ifdef FEATURE_HTTPS_FILTERING - else - { - /* set FD if some data are pending on TLS/SSL connections */ -#ifndef HAVE_POLL - FD_ZERO(&rfds); -#endif - if (read_ssl_client) - { -#ifdef HAVE_POLL - poll_fds[0].fd = csp->cfd; - poll_fds[0].events = POLLIN; -#else - FD_SET(csp->cfd, &rfds); -#endif - n++; - } - if (read_ssl_server) - { -#ifdef HAVE_POLL - poll_fds[1].fd = csp->server_connection.sfd; - poll_fds[1].events = POLLIN; -#else - FD_SET(csp->server_connection.sfd, &rfds); -#endif - n++; - } - } -#endif /* * This is the body of the browser's request, * just read and write it. @@ -2698,7 +2649,7 @@ static void handle_established_connection(struct client_state *csp) assert(max_bytes_to_read <= csp->receive_buffer_size); #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Reading data from standard or secured connection (HTTP/HTTPS) */ @@ -2730,7 +2681,7 @@ static void handle_established_connection(struct client_state *csp) } } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { len = read_socket(csp->cfd, csp->receive_buffer, max_bytes_to_read); @@ -2763,7 +2714,7 @@ static void handle_established_connection(struct client_state *csp) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -2800,7 +2751,7 @@ 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); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -2808,7 +2759,7 @@ static void handle_established_connection(struct client_state *csp) } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Reading data from standard or secured connection (HTTP/HTTPS) */ @@ -2829,7 +2780,7 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host); if ((http->ssl && (csp->fwd == NULL)) -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION && use_ssl_tunnel #endif ) @@ -2855,7 +2806,7 @@ 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); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -2924,7 +2875,7 @@ static void handle_established_connection(struct client_state *csp) { if (server_body || (http->ssl -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION && use_ssl_tunnel #endif )) @@ -2974,7 +2925,7 @@ static void handle_established_connection(struct client_state *csp) log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -2996,7 +2947,7 @@ static void handle_established_connection(struct client_state *csp) } } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { if (write_socket_delayed(csp->cfd, hdr, strlen(hdr), write_delay) || write_socket_delayed(csp->cfd, ((p != NULL) ? p : csp->iob->cur), @@ -3006,7 +2957,7 @@ static void handle_established_connection(struct client_state *csp) freez(hdr); freez(p); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3041,7 +2992,7 @@ static void handle_established_connection(struct client_state *csp) * content-filtering. */ if (server_body || (http->ssl -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION && use_ssl_tunnel #endif )) @@ -3072,14 +3023,14 @@ static void handle_established_connection(struct client_state *csp) rsp = cgi_error_memory(); send_crunch_response(csp, rsp); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; } hdrlen = strlen(hdr); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3101,7 +3052,7 @@ static void handle_established_connection(struct client_state *csp) } } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { if (write_socket_delayed(csp->cfd, hdr, hdrlen, write_delay) || ((flushed = flush_iob(csp->cfd, csp->iob, write_delay)) < 0) @@ -3112,7 +3063,7 @@ static void handle_established_connection(struct client_state *csp) "Flush header and buffers to client failed: %E"); freez(hdr); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3132,7 +3083,7 @@ static void handle_established_connection(struct client_state *csp) } else { -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3150,14 +3101,14 @@ static void handle_established_connection(struct client_state *csp) } } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { if (write_socket_delayed(csp->cfd, csp->receive_buffer, (size_t)len, write_delay)) { log_error(LOG_LEVEL_ERROR, "write to client failed: %E"); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3180,7 +3131,7 @@ static void handle_established_connection(struct client_state *csp) rsp = cgi_error_memory(); send_crunch_response(csp, rsp); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3200,7 +3151,7 @@ static void handle_established_connection(struct client_state *csp) "Applying the MS IIS5 hack didn't help."); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3211,14 +3162,14 @@ static void handle_established_connection(struct client_state *csp) strlen(INVALID_SERVER_HEADERS_RESPONSE)); } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { write_socket_delayed(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, strlen(INVALID_SERVER_HEADERS_RESPONSE), write_delay); } mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3266,7 +3217,7 @@ static void handle_established_connection(struct client_state *csp) } free_http_request(http); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3294,7 +3245,7 @@ static void handle_established_connection(struct client_state *csp) csp->headers->first->str); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3305,14 +3256,14 @@ static void handle_established_connection(struct client_state *csp) strlen(INVALID_SERVER_HEADERS_RESPONSE)); } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { write_socket_delayed(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, strlen(INVALID_SERVER_HEADERS_RESPONSE), write_delay); } free_http_request(http); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3326,7 +3277,7 @@ static void handle_established_connection(struct client_state *csp) { log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3344,7 +3295,7 @@ static void handle_established_connection(struct client_state *csp) } free_http_request(http); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3381,7 +3332,7 @@ static void handle_established_connection(struct client_state *csp) */ freez(hdr); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3398,7 +3349,7 @@ static void handle_established_connection(struct client_state *csp) * may be in the buffer). Use standard or secured * connection. */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION if (client_use_ssl(csp)) { if ((ssl_send_data(&(csp->mbedtls_client_attr.ssl), @@ -3414,14 +3365,14 @@ static void handle_established_connection(struct client_state *csp) */ freez(hdr); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; } } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { if (write_socket_delayed(csp->cfd, hdr, strlen(hdr), write_delay) || ((len = flush_iob(csp->cfd, csp->iob, write_delay)) < 0)) @@ -3434,7 +3385,7 @@ static void handle_established_connection(struct client_state *csp) */ freez(hdr); mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3459,7 +3410,7 @@ static void handle_established_connection(struct client_state *csp) "Applying the MS IIS5 hack didn't help."); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Sending data with standard or secured connection (HTTP/HTTPS) */ @@ -3470,13 +3421,13 @@ static void handle_established_connection(struct client_state *csp) strlen(INVALID_SERVER_HEADERS_RESPONSE)); } else -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ { write_socket_delayed(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, strlen(INVALID_SERVER_HEADERS_RESPONSE), write_delay); } mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; @@ -3485,12 +3436,12 @@ static void handle_established_connection(struct client_state *csp) continue; } mark_server_socket_tainted(csp); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif return; /* huh? we should never get here */ } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION close_client_and_server_ssl_connections(csp); #endif if (csp->content_length == 0) @@ -3550,7 +3501,7 @@ static void chat(struct client_state *csp) struct http_request *http; /* Skeleton for HTTP response, if we should intercept the request */ struct http_response *rsp; -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION int use_ssl_tunnel = 0; #endif @@ -3574,12 +3525,12 @@ static void chat(struct client_state *csp) return; } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Setting flags to use old solution with SSL tunnel and to disable * certificates verification. */ - if (csp->http->ssl && !(csp->action->flags & ACTION_ENABLE_HTTPS_FILTER)) + if (csp->http->ssl && !(csp->action->flags & ACTION_HTTPS_INSPECTION)) { use_ssl_tunnel = 1; } @@ -3631,7 +3582,7 @@ static void chat(struct client_state *csp) * */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Presetting SSL client and server flags */ @@ -3657,7 +3608,7 @@ static void chat(struct client_state *csp) csp->ip_addr_str, acceptable_connect_ports, csp->http->hostport); csp->action->flags |= ACTION_BLOCK; http->ssl = 0; -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION http->client_ssl = 0; http->server_ssl = 0; #endif @@ -3674,7 +3625,7 @@ static void chat(struct client_state *csp) * response later. */ if ( -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION !client_use_ssl(csp) && #endif crunch_response_triggered(csp, crunchers_all)) @@ -3731,7 +3682,7 @@ static void chat(struct client_state *csp) mark_connection_closed(&csp->server_connection); } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION if (http->ssl && !use_ssl_tunnel) { int ret; @@ -3830,7 +3781,7 @@ static void chat(struct client_state *csp) return; } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* * Creating TLS/SSL connections with destination server or parent * proxy. If forwarding is enabled, we must send client request to @@ -3948,25 +3899,38 @@ static void chat(struct client_state *csp) * with destination server */ int ret = create_server_ssl_connection(csp); - /* - * If TLS/SSL connection wasn't created and invalid certificate - * wasn't detected, we can interrupt this function. Otherwise, we - * must inform client about invalid server certificate. - */ - if (ret != 0 - && (csp->server_cert_verification_result == SSL_CERT_NOT_VERIFIED - || csp->server_cert_verification_result == SSL_CERT_VALID)) + if (ret != 0) { - rsp = error_response(csp, "connect-failed"); - if (rsp) + if (csp->server_cert_verification_result != SSL_CERT_VALID && + csp->server_cert_verification_result != SSL_CERT_NOT_VERIFIED) { - send_crunch_response(csp, rsp); + /* + * If the server certificate is invalid, we must inform + * the client and then close connection to the client. + */ + ssl_send_certificate_error(csp); + close_client_and_server_ssl_connections(csp); + return; + } + if (csp->server_cert_verification_result == SSL_CERT_NOT_VERIFIED + || csp->server_cert_verification_result == SSL_CERT_VALID) + { + /* + * The TLS/SSL connection wasn't created but an invalid + * certificate wasn't detected. Report it as connection + * failure. + */ + rsp = error_response(csp, "connect-failed"); + if (rsp) + { + send_crunch_response(csp, rsp); + } + return; } - return; } } }/* -END- if (http->ssl) */ -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ #ifdef FEATURE_CONNECTION_KEEP_ALIVE save_connection_destination(csp->server_connection.sfd, @@ -3984,7 +3948,7 @@ static void chat(struct client_state *csp) assert(csp->headers->last == NULL); } else if (http->ssl == 0 || (fwd->forward_host -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION && use_ssl_tunnel #endif )) @@ -4005,7 +3969,7 @@ static void chat(struct client_state *csp) * Using old solution with SSL tunnel or new solution with SSL proxy */ list_remove_all(csp->headers); -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION if (use_ssl_tunnel) #endif { @@ -4020,7 +3984,7 @@ static void chat(struct client_state *csp) return; } } -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION else { /* @@ -4038,13 +4002,13 @@ static void chat(struct client_state *csp) rsp = error_response(csp, "connect-failed"); if (rsp) { - send_crunch_response(csp, rsp); /* XXX: use ssl*/ + send_crunch_response(csp, rsp); } close_client_and_server_ssl_connections(csp); return; } } -#endif /* def FEATURE_HTTPS_FILTERING */ +#endif /* def FEATURE_HTTPS_INSPECTION */ clear_iob(csp->client_iob); }/* -END- else ... if (http->ssl == 1) */ @@ -4583,17 +4547,10 @@ static void initialize_mutexes(void) * Prepare global mutex semaphores */ -#ifdef LIMIT_MUTEX_NUMBER - int i = 0; - for (i = 0; i < 32; i++) -#else - int i = 0; - for (i = 0; i < 65536; i++) -#endif /* LIMIT_MUTEX_NUMBER */ - { - privoxy_mutex_init(&(certificates_mutexes[i])); - } +#ifdef FEATURE_HTTPS_INSPECTION + privoxy_mutex_init(&certificate_mutex); privoxy_mutex_init(&rng_mutex); +#endif privoxy_mutex_init(&log_mutex); privoxy_mutex_init(&log_init_mutex); @@ -5630,7 +5587,7 @@ static void listen_loop(void) /* NOTREACHED unless FEATURE_GRACEFUL_TERMINATION is defined */ -#ifdef FEATURE_HTTPS_FILTERING +#ifdef FEATURE_HTTPS_INSPECTION /* Clean up. Aim: free all memory (no leaks) */ if (rng_seeded == 1) {