libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

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:
Msrc/mhd2/daemon_add_conn.c | 51++++++++++++++++++++++++---------------------------
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) {