Makes SOMAXCONN user-configurable.
authorJesse Williamson <jesse.williamson@canonical.com>
Thu, 16 Feb 2023 10:54:41 +0000 (10:54 +0000)
committerThomas Goirand <zigo@debian.org>
Thu, 16 Feb 2023 10:54:41 +0000 (10:54 +0000)
Origin: upstream, https://github.com/civetweb/civetweb/pull/776/commits/febab7dc38c9671577603425c54c20f841e27f97
Bug: https://github.com/civetweb/civetweb/issues/775
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/ceph/+bug/1838109

Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/ceph/+bug/1838109
Gbp-Pq: Name civetweb-755-1.8-somaxconn-configurable.patch

src/civetweb/src/civetweb.c

index 76f097ac1cafa172bedb2fd3f1a117be3f066367..bd15373dbf92c3a361da4b0a85d98563d9f5e1a0 100644 (file)
@@ -1541,10 +1541,6 @@ typedef int socklen_t;
 #define MSG_NOSIGNAL (0)
 #endif
 
-#if !defined(SOMAXCONN)
-#define SOMAXCONN (100)
-#endif
-
 /* Size of the accepted socket queue */
 #if !defined(MGSQLEN)
 #define MGSQLEN (20)
@@ -2063,6 +2059,7 @@ enum {
        SSL_CERTIFICATE,
        SSL_CERTIFICATE_CHAIN,
        NUM_THREADS,
+       SO_MAX_CONNECTIONS,
        RUN_AS_USER,
        URL_REWRITE_PATTERN,
        HIDE_FILES,
@@ -2165,6 +2162,7 @@ static struct mg_option config_options[] = {
     {"ssl_certificate", CONFIG_TYPE_FILE, NULL},
     {"ssl_certificate_chain", CONFIG_TYPE_FILE, NULL},
     {"num_threads", CONFIG_TYPE_NUMBER, "50"},
+    {"max_connections", CONFIG_TYPE_NUMBER, "100"},
     {"run_as_user", CONFIG_TYPE_STRING, NULL},
     {"url_rewrite_patterns", CONFIG_TYPE_STRING_LIST, NULL},
     {"hide_files_patterns", CONFIG_TYPE_EXT_PATTERN, NULL},
@@ -13340,7 +13338,15 @@ set_ports_option(struct mg_context *ctx)
                        continue;
                }
 
-               if (listen(so.sock, SOMAXCONN) != 0) {
+               char *p = ctx->config[SO_MAX_CONNECTIONS];
+               long opt_max_connections = strtol(p, NULL, 10);
+               if(opt_max_connections > INT_MAX || opt_max_connections < 1) {
+                       mg_cry(fc(ctx),
+                              "max_connections value \"%s\" is invalid", p);
+                       continue;
+               }
+
+               if (listen(so.sock, (int)opt_max_connections) != 0) {
 
                        mg_cry(fc(ctx),
                               "cannot listen to %.*s: %d (%s)",