* 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
#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" */
log_error(LOG_LEVEL_FATAL, "Directive %s used without argument", name);
}
- number = (int)strtol(value, &endptr, 0);
+ number = (int)strtol(value, &endptr, 10);
if (*endptr != '\0')
{
log_error(LOG_LEVEL_FATAL,
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
{
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;
}
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);
}
* 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;
/* *************************************************************************