Streamline handle_established_connection()'s parameter list
[privoxy.git] / jcc.c
diff --git a/jcc.c b/jcc.c
index fbeb6c0..3bbacd1 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.460 2017/06/08 13:05:09 fabiankeil Exp $";
+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 $
@@ -105,6 +105,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.460 2017/06/08 13:05:09 fabiankeil Exp $"
 # ifndef FD_ZERO
 #  include <select.h>
 # endif
+#warning poll() appears to be unavailable. Your platform will become unsupported in the future.
 #endif /* HAVE_POLL */
 
 #endif
@@ -162,7 +163,7 @@ static void serve(struct client_state *csp);
 static void usage(const char *myname);
 #endif
 static void initialize_mutexes(void);
-static jb_socket bind_port_helper(const char *haddr, int hport);
+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);
@@ -1852,6 +1853,10 @@ static jb_err parse_client_request(struct client_state *csp)
       }
       verify_request_length(csp);
    }
+   else
+   {
+      csp->flags |= CSP_FLAG_SERVER_SOCKET_TAINTED;
+   }
 #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
 
    err = sed(csp, FILTER_CLIENT_HEADERS);
@@ -1959,8 +1964,7 @@ static int send_http_request(struct client_state *csp)
  * Returns     :  Nothing.
  *
  *********************************************************************/
-static void handle_established_connection(struct client_state *csp,
-                                          const struct forward_spec *fwd)
+static void handle_established_connection(struct client_state *csp)
 {
    char *receive_buffer;
    char *hdr;
@@ -2112,8 +2116,8 @@ static void handle_established_connection(struct client_state *csp,
 
       if (n == 0)
       {
-         log_error(LOG_LEVEL_ERROR,
-            "Didn't receive data in time: %s", http->url);
+         log_error(LOG_LEVEL_CONNECT, "Socket timeout %d reached: %s",
+            csp->config->socket_timeout, http->url);
          if ((byte_count == 0) && (http->ssl == 0))
          {
             send_crunch_response(csp, error_response(csp, "connection-timeout"));
@@ -2279,7 +2283,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 && (fwd->forward_host == NULL))
+            if (http->ssl && (csp->fwd == NULL))
             {
                /*
                 * Just hang up. We already confirmed the client's CONNECT
@@ -3027,7 +3031,7 @@ static void chat(struct client_state *csp)
    /* XXX: should the time start earlier for optimistically sent data? */
    csp->server_connection.request_sent = time(NULL);
 
-   handle_established_connection(csp, fwd);
+   handle_established_connection(csp);
 }
 
 
@@ -3064,6 +3068,7 @@ extern int fuzz_server_response(struct client_state *csp, char *fuzz_input_file)
             fuzz_input_file);
       }
    }
+   csp->fwd = &fwd;
    csp->content_type |= CT_GIF;
    csp->action->flags |= ACTION_DEANIMATE;
    csp->action->string[ACTION_STRING_DEANIMATE] = "last";
@@ -3084,7 +3089,7 @@ extern int fuzz_server_response(struct client_state *csp, char *fuzz_input_file)
 
    cgi_init_error_messages();
 
-   handle_established_connection(csp, &fwd);
+   handle_established_connection(csp);
 
    return 0;
 }
@@ -3382,6 +3387,8 @@ static void serve(struct client_state *csp)
       drain_and_close_socket(csp->cfd);
    }
 
+   free_csp_resources(csp);
+
    csp->flags &= ~CSP_FLAG_ACTIVE;
 
 }
@@ -4116,16 +4123,17 @@ int main(int argc, char **argv)
  *          1  :  haddr = Host address to bind to. Use NULL to bind to
  *                        INADDR_ANY.
  *          2  :  hport = Specifies port to bind to.
+ *          3  :  backlog = Listen backlog.
  *
  * Returns     :  Port that was opened.
  *
  *********************************************************************/
-static jb_socket bind_port_helper(const char *haddr, int hport)
+static jb_socket bind_port_helper(const char *haddr, int hport, int backlog)
 {
    int result;
    jb_socket bfd;
 
-   result = bind_port(haddr, hport, &bfd);
+   result = bind_port(haddr, hport, backlog, &bfd);
 
    if (result < 0)
    {
@@ -4205,7 +4213,22 @@ static void bind_ports_helper(struct configuration_spec * config,
    {
       if (config->hport[i])
       {
-         sockets[i] = bind_port_helper(config->haddr[i], config->hport[i]);
+         sockets[i] = bind_port_helper(config->haddr[i],
+            config->hport[i], config->listen_backlog);
+#if defined(FEATURE_ACCEPT_FILTER) && defined(SO_ACCEPTFILTER)
+         if (config->enable_accept_filter && sockets[i] != JB_INVALID_SOCKET)
+         {
+            struct accept_filter_arg af_options;
+            bzero(&af_options, sizeof(af_options));
+            strlcpy(af_options.af_name, "httpready", sizeof(af_options.af_name));
+            if (setsockopt(sockets[i], SOL_SOCKET, SO_ACCEPTFILTER, &af_options,
+                  sizeof(af_options)))
+            {
+               log_error(LOG_LEVEL_ERROR,
+                  "Enabling accept filter for socket %d failed: %E", sockets[i]);
+            }
+         }
+#endif
       }
       else
       {
@@ -4274,6 +4297,12 @@ static void listen_loop(void)
    jb_socket bfds[MAX_LISTENING_SOCKETS];
    struct configuration_spec *config;
    unsigned int active_threads = 0;
+#if defined(FEATURE_PTHREAD)
+   pthread_attr_t attrs;
+
+   pthread_attr_init(&attrs);
+   pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
+#endif
 
    config = load_config();
 
@@ -4429,14 +4458,10 @@ static void listen_loop(void)
 #define SELECTED_ONE_OPTION
          {
             pthread_t the_thread;
-            pthread_attr_t attrs;
 
-            pthread_attr_init(&attrs);
-            pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
             errno = pthread_create(&the_thread, &attrs,
                (void * (*)(void *))serve, csp);
             child_id = errno ? -1 : 0;
-            pthread_attr_destroy(&attrs);
          }
 #endif
 
@@ -4601,6 +4626,10 @@ static void listen_loop(void)
       }
    }
 
+#if defined(FEATURE_PTHREAD)
+   pthread_attr_destroy(&attrs);
+#endif
+
    /* NOTREACHED unless FEATURE_GRACEFUL_TERMINATION is defined */
 
    /* Clean up.  Aim: free all memory (no leaks) */