Add read_socks_reply() and start using it in socks5_connect()
[privoxy.git] / loadcfg.c
index 9b39f54..f98e084 100644 (file)
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -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" */
@@ -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;
 
 /* *************************************************************************