Revert "receive_and_send_encrypted_post_data(): Additionally check for data being...
[privoxy.git] / loadcfg.c
index 9b39f54..4efa2ea 100644 (file)
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -7,7 +7,7 @@
  *                routine to load the configuration and the global
  *                variables it writes to.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2017 the
+ * Copyright   :  Written by and Copyright (C) 2001-2022 the
  *                Privoxy team. https://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
@@ -140,7 +140,7 @@ static struct file_list *current_configfile = NULL;
 #define hash_cipher_list                 1225729316U /* "cipher-list" */
 #define hash_client_header_order         2701453514U /* "client-header-order" */
 #define hash_client_specific_tag         3353703383U /* "client-specific-tag" */
-#define hash_client_tag_lifetime          647957580U /* "client-tag-lifetime" */
+#define hash_client_tag_lifetime         3239141416U /* "client-tag-lifetime" */
 #define hash_compression_level           2464423563U /* "compression-level" */
 #define hash_confdir                        1978389U /* "confdir" */
 #define hash_connection_sharing          1348841265U /* "connection-sharing" */
@@ -634,12 +634,12 @@ struct configuration_spec * load_config(void)
    config->proxy_args                = strdup_or_die("");
    config->forwarded_connect_retries = 0;
 #ifdef FEATURE_HTTPS_INSPECTION
-   config->ca_password               = strdup("");
-   ca_cert_file                      = strdup("cacert.crt");
-   ca_key_file                       = strdup("cakey.pem");
-   ca_directory                      = strdup("./CA");
-   trusted_cas_file                  = strdup("trustedCAs.pem");
-   certificate_directory             = strdup("./certs");
+   config->ca_password               = strdup_or_die("");
+   ca_cert_file                      = strdup_or_die("cacert.crt");
+   ca_key_file                       = strdup_or_die("cakey.pem");
+   ca_directory                      = strdup_or_die("./CA");
+   trusted_cas_file                  = strdup_or_die("trustedCAs.pem");
+   certificate_directory             = strdup_or_die("./certs");
 #endif
 
 #ifdef FEATURE_CLIENT_TAGS
@@ -1460,13 +1460,41 @@ struct configuration_spec * load_config(void)
          {
             int max_client_connections = parse_numeric_value(cmd, arg);
 
+#if !defined(_WIN32) && !defined(HAVE_POLL)
+            /*
+             * Reject values below 1 for obvious reasons and values above
+             * FD_SETSIZE/2 because Privoxy needs two sockets to serve
+             * client connections that need forwarding.
+             *
+             * We ignore the fact that the first three file descriptors
+             * are usually set to /dev/null, one is used for logging
+             * and yet another file descriptor is required to load
+             * config files.
+             */
+            if ((max_client_connections < 1) || (FD_SETSIZE/2 < max_client_connections))
+            {
+               log_error(LOG_LEVEL_FATAL, "max-client-connections value %d"
+                  " is invalid. Value needs to be above 1 and below %d"
+                  " (FD_SETSIZE/2).", max_client_connections, FD_SETSIZE/2);
+            }
+#else
+            /*
+             * The Windows libc uses FD_SETSIZE for an array used
+             * by select(), but has no problems with file descriptors
+             * above the limit as long as no more than FD_SETSIZE are
+             * passed to select().
+             * https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169%28v=vs.85%29.aspx
+             *
+             * On platforms were we use poll() we don't have to enforce
+             * an upper connection limit either.
+             */
             if (max_client_connections < 1)
             {
                log_error(LOG_LEVEL_FATAL, "max-client-connections value"
                   " has to be a number above 1. %d is invalid.",
                   max_client_connections);
             }
-
+#endif
             config->max_client_connections = max_client_connections;
             break;
          }
@@ -1564,7 +1592,7 @@ struct configuration_spec * load_config(void)
             if (config->receive_buffer_size < BUFFER_SIZE)
             {
                log_error(LOG_LEVEL_INFO,
-                  "receive-buffer-size %lu seems low and may cause problems."
+                  "receive-buffer-size %lu seems low and may cause problems. "
                   "Consider setting it to at least %d.",
                   config->receive_buffer_size, BUFFER_SIZE);
             }
@@ -1574,7 +1602,7 @@ struct configuration_spec * load_config(void)
  * single-threaded 0|1
  * *************************************************************************/
          case hash_single_threaded :
-            config->multi_threaded =  0 == parse_toggle_state(cmd, arg);
+            config->multi_threaded = 0 == parse_toggle_state(cmd, arg);
             break;
 
 /* *************************************************************************