commit b095b425d7a624f96895bdafb8eb6d134002f2d0
parent f34e82601645693ba85385d5de37ca5a34751ea7
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Sun, 8 Feb 2026 16:12:18 +0100
Better handle size of sockaddr for externally added connections
Diffstat:
1 file changed, 24 insertions(+), 27 deletions(-)
diff --git a/src/mhd2/daemon_add_conn.c b/src/mhd2/daemon_add_conn.c
@@ -699,26 +699,25 @@ MHD_daemon_add_connection (struct MHD_Daemon *MHD_RESTRICT daemon,
&& daemon->conns.block_new)
ret = MHD_SC_LIMIT_CONNECTIONS_REACHED;
- if ((MHD_SC_OK == ret) &&
- (0 != addr_size))
+ if (NULL != addr)
{
- if (addr_size < (sizeof(addr->sa_family)
- + offsetof (struct sockaddr, sa_family)))
- {
- mhd_LOG_MSG (daemon, MHD_SC_CONFIGURATION_WRONG_SA_SIZE, \
- "MHD_add_connection() has been called with " \
- "incorrect 'addr_size' value.");
- ret = MHD_SC_CONFIGURATION_WRONG_SA_SIZE;
- }
+ bool log_bad_addlen;
+
+ log_bad_addlen = false;
+ if (0u == addr_size)
+ log_bad_addlen = true;
+ else if (addr_size < (sizeof(addr->sa_family)
+ + offsetof (struct sockaddr, sa_family)))
+ log_bad_addlen = true;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ else if (addr_size < (sizeof(addr->sa_len)
+ + offsetof (struct sockaddr, sa_len)))
+ log_bad_addlen = true;
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
else if (AF_INET == addr->sa_family)
{
if (sizeof(struct sockaddr_in) > addr_size)
- {
- mhd_LOG_MSG (daemon, MHD_SC_CONFIGURATION_WRONG_SA_SIZE, \
- "MHD_add_connection() has been called with " \
- "incorrect 'addr_size' value.");
- ret = MHD_SC_CONFIGURATION_WRONG_SA_SIZE;
- }
+ log_bad_addlen = true;
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
else if ((0 != addr->sa_len) &&
(sizeof(struct sockaddr_in) > (size_t) addr->sa_len) )
@@ -734,13 +733,8 @@ MHD_daemon_add_connection (struct MHD_Daemon *MHD_RESTRICT daemon,
#ifdef HAVE_INET6
else if (AF_INET6 == addr->sa_family)
{
- if (sizeof(struct sockaddr_in6) > addr_size)
- {
- mhd_LOG_MSG (daemon, MHD_SC_CONFIGURATION_WRONG_SA_SIZE, \
- "MHD_add_connection() has been called with " \
- "incorrect 'addr_size' value.");
- ret = MHD_SC_CONFIGURATION_WRONG_SA_SIZE;
- }
+ if (sizeof(struct sockaddr_in6) != addr_size)
+ log_bad_addlen = true;
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
else if ((0 != addr->sa_len) &&
(sizeof(struct sockaddr_in6) > (size_t) addr->sa_len) )
@@ -753,21 +747,24 @@ MHD_daemon_add_connection (struct MHD_Daemon *MHD_RESTRICT daemon,
}
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
}
-#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
- else if (addr_size < (sizeof(addr->sa_len)
- + offsetof (struct sockaddr, sa_len)))
+#endif /* HAVE_INET6 */
+ mhd_ASSUME ((log_bad_addlen && (MHD_SC_OK == ret)) ||
+ ((MHD_SC_OK != ret) && ! log_bad_addlen) || (MHD_SC_OK == ret));
+ if (log_bad_addlen)
{
mhd_LOG_MSG (daemon, MHD_SC_CONFIGURATION_WRONG_SA_SIZE, \
"MHD_add_connection() has been called with " \
"incorrect 'addr_size' value.");
ret = MHD_SC_CONFIGURATION_WRONG_SA_SIZE;
}
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
if ((0 != addr->sa_len) &&
(addr_size > (size_t) addr->sa_len))
addr_size = (size_t) addr->sa_len; /* Use safest value */
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
-#endif /* HAVE_INET6 */
}
+ else
+ addr_size = 0u;
if (MHD_SC_OK == ret)
{