summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2023-06-14 13:46:54 +0300
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2023-06-20 23:22:56 +0300
commitc1b6751c11314d046c87ea83ef611d95c44e2be7 (patch)
treef7a4e5802d08544a7195bb67295af84001c0948f
parent5a9f64bc6a497a41f0cbcd80ee883e0747c08a98 (diff)
Added checks for correct values specified for connection memory limits
-rw-r--r--src/include/microhttpd.h6
-rw-r--r--src/microhttpd/daemon.c31
2 files changed, 35 insertions, 2 deletions
diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index 4976b071..8745367c 100644
--- a/src/include/microhttpd.h
+++ b/src/include/microhttpd.h
@@ -96,7 +96,7 @@ extern "C"
* they are parsed as decimal numbers.
* Example: 0x01093001 = 1.9.30-1.
*/
-#define MHD_VERSION 0x00097702
+#define MHD_VERSION 0x00097703
/* If generic headers don't work on your platform, include headers
which define 'va_list', 'size_t', 'ssize_t', 'intptr_t', 'off_t',
@@ -1626,6 +1626,7 @@ enum MHD_OPTION
* Values above 128k are unlikely to result in much benefit, as half
* of the memory will be typically used for IO, and TCP buffers are
* unlikely to support window sizes above 64k on most systems.
+ * Values below 64 bytes are completely unusable.
*/
MHD_OPTION_CONNECTION_MEMORY_LIMIT = 1,
@@ -1864,7 +1865,8 @@ enum MHD_OPTION
/**
* Increment to use for growing the read buffer (followed by a
- * `size_t`). Must fit within #MHD_OPTION_CONNECTION_MEMORY_LIMIT.
+ * `size_t`).
+ * Must not be higher than 1/4 of #MHD_OPTION_CONNECTION_MEMORY_LIMIT.
*/
MHD_OPTION_CONNECTION_MEMORY_INCREMENT = 21,
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index f310e1c7..c403d02b 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -6250,10 +6250,41 @@ parse_options_va (struct MHD_Daemon *daemon,
case MHD_OPTION_CONNECTION_MEMORY_LIMIT:
daemon->pool_size = va_arg (ap,
size_t);
+ if (64 > daemon->pool_size)
+ {
+#ifdef HAVE_MESSAGES
+ MHD_DLOG (daemon,
+ _ ("Warning: specified MHD_OPTION_CONNECTION_MEMORY_LIMIT " \
+ "value is too small and rounded up to 64.\n"));
+#endif /* HAVE_MESSAGES */
+ daemon->pool_size = 64;
+ }
+ if (daemon->pool_size / 4 < daemon->pool_increment)
+ daemon->pool_increment = daemon->pool_size / 4;
break;
case MHD_OPTION_CONNECTION_MEMORY_INCREMENT:
daemon->pool_increment = va_arg (ap,
size_t);
+ if (0 == daemon->pool_increment)
+ {
+#ifdef HAVE_MESSAGES
+ MHD_DLOG (daemon,
+ _ ("The MHD_OPTION_CONNECTION_MEMORY_INCREMENT value " \
+ "cannot be zero.\n"));
+#endif /* HAVE_MESSAGES */
+ return MHD_NO;
+ }
+ if (daemon->pool_size / 4 < daemon->pool_increment)
+ {
+#ifdef HAVE_MESSAGES
+ MHD_DLOG (daemon,
+ _ ("Warning: specified " \
+ "MHD_OPTION_CONNECTION_MEMORY_INCREMENT value is too " \
+ "large and rounded down to 1/4 of " \
+ "MHD_OPTION_CONNECTION_MEMORY_LIMIT.\n"));
+#endif /* HAVE_MESSAGES */
+ daemon->pool_increment = daemon->pool_size / 4;
+ }
break;
case MHD_OPTION_CONNECTION_LIMIT:
daemon->connection_limit = va_arg (ap,