diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-06-14 13:46:54 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-06-20 23:22:56 +0300 |
commit | c1b6751c11314d046c87ea83ef611d95c44e2be7 (patch) | |
tree | f7a4e5802d08544a7195bb67295af84001c0948f | |
parent | 5a9f64bc6a497a41f0cbcd80ee883e0747c08a98 (diff) |
Added checks for correct values specified for connection memory limits
-rw-r--r-- | src/include/microhttpd.h | 6 | ||||
-rw-r--r-- | src/microhttpd/daemon.c | 31 |
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, |