aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r--src/microhttpd/daemon.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 37dc214f..f548b434 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -321,7 +321,7 @@ MHD_ip_addr_compare (const void *a1,
321 * @return #MHD_YES on success and #MHD_NO otherwise (e.g., invalid address type) 321 * @return #MHD_YES on success and #MHD_NO otherwise (e.g., invalid address type)
322 */ 322 */
323static enum MHD_Result 323static enum MHD_Result
324MHD_ip_addr_to_key (const struct sockaddr *addr, 324MHD_ip_addr_to_key (const struct sockaddr_storage *addr,
325 socklen_t addrlen, 325 socklen_t addrlen,
326 struct MHD_IPCount *key) 326 struct MHD_IPCount *key)
327{ 327{
@@ -332,13 +332,12 @@ MHD_ip_addr_to_key (const struct sockaddr *addr,
332 /* IPv4 addresses */ 332 /* IPv4 addresses */
333 if (sizeof (struct sockaddr_in) <= (size_t) addrlen) 333 if (sizeof (struct sockaddr_in) <= (size_t) addrlen)
334 { 334 {
335 if (AF_INET == addr->sa_family) 335 if (AF_INET == addr->ss_family)
336 { 336 {
337 key->family = AF_INET; 337 key->family = AF_INET;
338 memcpy (&key->addr.ipv4, 338 memcpy (&key->addr.ipv4,
339 ((const uint8_t *) addr) 339 &((const struct sockaddr_in *) addr)->sin_addr,
340 + _MHD_OFFSETOF (struct sockaddr_in, sin_addr), 340 sizeof(((const struct sockaddr_in *) NULL)->sin_addr));
341 sizeof(((struct sockaddr_in *) NULL)->sin_addr));
342 return MHD_YES; 341 return MHD_YES;
343 } 342 }
344 } 343 }
@@ -347,13 +346,12 @@ MHD_ip_addr_to_key (const struct sockaddr *addr,
347 if (sizeof (struct sockaddr_in6) <= (size_t) addrlen) 346 if (sizeof (struct sockaddr_in6) <= (size_t) addrlen)
348 { 347 {
349 /* IPv6 addresses */ 348 /* IPv6 addresses */
350 if (AF_INET6 == addr->sa_family) 349 if (AF_INET6 == addr->ss_family)
351 { 350 {
352 key->family = AF_INET6; 351 key->family = AF_INET6;
353 memcpy (&key->addr.ipv6, 352 memcpy (&key->addr.ipv6,
354 ((const uint8_t *) addr) 353 &((const struct sockaddr_in6 *) addr)->sin6_addr,
355 + _MHD_OFFSETOF (struct sockaddr_in6, sin6_addr), 354 sizeof(((const struct sockaddr_in6 *) NULL)->sin6_addr));
356 sizeof(((struct sockaddr_in6 *) NULL)->sin6_addr));
357 return MHD_YES; 355 return MHD_YES;
358 } 356 }
359 } 357 }
@@ -377,7 +375,7 @@ MHD_ip_addr_to_key (const struct sockaddr *addr,
377 */ 375 */
378static enum MHD_Result 376static enum MHD_Result
379MHD_ip_limit_add (struct MHD_Daemon *daemon, 377MHD_ip_limit_add (struct MHD_Daemon *daemon,
380 const struct sockaddr *addr, 378 const struct sockaddr_storage *addr,
381 socklen_t addrlen) 379 socklen_t addrlen)
382{ 380{
383 struct MHD_IPCount *newkeyp; 381 struct MHD_IPCount *newkeyp;
@@ -445,7 +443,7 @@ MHD_ip_limit_add (struct MHD_Daemon *daemon,
445 */ 443 */
446static void 444static void
447MHD_ip_limit_del (struct MHD_Daemon *daemon, 445MHD_ip_limit_del (struct MHD_Daemon *daemon,
448 const struct sockaddr *addr, 446 const struct sockaddr_storage *addr,
449 socklen_t addrlen) 447 socklen_t addrlen)
450{ 448{
451 struct MHD_IPCount search_key; 449 struct MHD_IPCount search_key;
@@ -2423,7 +2421,7 @@ psk_gnutls_adapter (gnutls_session_t session,
2423static struct MHD_Connection * 2421static struct MHD_Connection *
2424new_connection_prepare_ (struct MHD_Daemon *daemon, 2422new_connection_prepare_ (struct MHD_Daemon *daemon,
2425 MHD_socket client_socket, 2423 MHD_socket client_socket,
2426 const struct sockaddr *addr, 2424 const struct sockaddr_storage *addr,
2427 socklen_t addrlen, 2425 socklen_t addrlen,
2428 bool external_add, 2426 bool external_add,
2429 bool non_blck, 2427 bool non_blck,
@@ -2461,7 +2459,7 @@ new_connection_prepare_ (struct MHD_Daemon *daemon,
2461 /* apply connection acceptance policy if present */ 2459 /* apply connection acceptance policy if present */
2462 if ( (NULL != daemon->apc) && 2460 if ( (NULL != daemon->apc) &&
2463 (MHD_NO == daemon->apc (daemon->apc_cls, 2461 (MHD_NO == daemon->apc (daemon->apc_cls,
2464 addr, 2462 (const struct sockaddr *) addr,
2465 addrlen)) ) 2463 addrlen)) )
2466 { 2464 {
2467#if _MHD_DEBUG_CLOSE 2465#if _MHD_DEBUG_CLOSE
@@ -2964,7 +2962,7 @@ new_connection_process_ (struct MHD_Daemon *daemon,
2964static enum MHD_Result 2962static enum MHD_Result
2965internal_add_connection (struct MHD_Daemon *daemon, 2963internal_add_connection (struct MHD_Daemon *daemon,
2966 MHD_socket client_socket, 2964 MHD_socket client_socket,
2967 const struct sockaddr *addr, 2965 const struct sockaddr_storage *addr,
2968 socklen_t addrlen, 2966 socklen_t addrlen,
2969 bool external_add, 2967 bool external_add,
2970 bool non_blck, 2968 bool non_blck,
@@ -3491,6 +3489,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
3491{ 3489{
3492 bool sk_nonbl; 3490 bool sk_nonbl;
3493 bool sk_spipe_supprs; 3491 bool sk_spipe_supprs;
3492 struct sockaddr_storage addrstorage;
3494 3493
3495 /* NOT thread safe with internal thread. TODO: fix thread safety. */ 3494 /* NOT thread safe with internal thread. TODO: fix thread safety. */
3496 if ((0 == (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) && 3495 if ((0 == (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) &&
@@ -3591,6 +3590,13 @@ MHD_add_connection (struct MHD_Daemon *daemon,
3591#endif 3590#endif
3592 } 3591 }
3593 3592
3593 /* Copy to sockaddr_storage structure to avoid alignment problems */
3594 if (0 < addrlen)
3595 memcpy (&addrstorage, addr, (size_t) addrlen);
3596#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
3597 addrstorage.ss_len = addrlen; /* Force set the right length */
3598#endif /* HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN */
3599
3594#if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 3600#if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
3595 if (NULL != daemon->worker_pool) 3601 if (NULL != daemon->worker_pool)
3596 { 3602 {
@@ -3606,7 +3612,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
3606 if (worker->connections < worker->connection_limit) 3612 if (worker->connections < worker->connection_limit)
3607 return internal_add_connection (worker, 3613 return internal_add_connection (worker,
3608 client_socket, 3614 client_socket,
3609 addr, 3615 &addrstorage,
3610 addrlen, 3616 addrlen,
3611 true, 3617 true,
3612 sk_nonbl, 3618 sk_nonbl,
@@ -3624,7 +3630,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
3624 3630
3625 return internal_add_connection (daemon, 3631 return internal_add_connection (daemon,
3626 client_socket, 3632 client_socket,
3627 addr, 3633 &addrstorage,
3628 addrlen, 3634 addrlen,
3629 true, 3635 true,
3630 sk_nonbl, 3636 sk_nonbl,
@@ -3650,12 +3656,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
3650static enum MHD_Result 3656static enum MHD_Result
3651MHD_accept_connection (struct MHD_Daemon *daemon) 3657MHD_accept_connection (struct MHD_Daemon *daemon)
3652{ 3658{
3653#ifdef HAVE_INET6 3659 struct sockaddr_storage addrstorage;
3654 struct sockaddr_in6 addrstorage;
3655#else
3656 struct sockaddr_in addrstorage;
3657#endif
3658 struct sockaddr *addr = (struct sockaddr *) &addrstorage;
3659 socklen_t addrlen; 3660 socklen_t addrlen;
3660 MHD_socket s; 3661 MHD_socket s;
3661 MHD_socket fd; 3662 MHD_socket fd;
@@ -3669,16 +3670,21 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
3669 mhd_assert (NULL == daemon->worker_pool); 3670 mhd_assert (NULL == daemon->worker_pool);
3670#endif /* MHD_USE_THREADS */ 3671#endif /* MHD_USE_THREADS */
3671 3672
3672 addrlen = sizeof (addrstorage);
3673 memset (addr,
3674 0,
3675 sizeof (addrstorage));
3676 if ( (MHD_INVALID_SOCKET == (fd = daemon->listen_fd)) || 3673 if ( (MHD_INVALID_SOCKET == (fd = daemon->listen_fd)) ||
3677 (daemon->was_quiesced) ) 3674 (daemon->was_quiesced) )
3678 return MHD_NO; 3675 return MHD_NO;
3676
3677 addrlen = (socklen_t) sizeof (addrstorage);
3678 memset (&addrstorage,
3679 0,
3680 (size_t) addrlen);
3681#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
3682 addrstorage.ss_len = addrlen;
3683#endif /* HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN */
3684
3679#ifdef USE_ACCEPT4 3685#ifdef USE_ACCEPT4
3680 s = accept4 (fd, 3686 s = accept4 (fd,
3681 addr, 3687 &addrstorage,
3682 &addrlen, 3688 &addrlen,
3683 SOCK_CLOEXEC_OR_ZERO | SOCK_NONBLOCK_OR_ZERO 3689 SOCK_CLOEXEC_OR_ZERO | SOCK_NONBLOCK_OR_ZERO
3684 | SOCK_NOSIGPIPE_OR_ZERO); 3690 | SOCK_NOSIGPIPE_OR_ZERO);
@@ -3691,7 +3697,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
3691 sk_cloexec = (SOCK_CLOEXEC_OR_ZERO != 0); 3697 sk_cloexec = (SOCK_CLOEXEC_OR_ZERO != 0);
3692#else /* ! USE_ACCEPT4 */ 3698#else /* ! USE_ACCEPT4 */
3693 s = accept (fd, 3699 s = accept (fd,
3694 addr, 3700 (struct sockaddr *) &addrstorage,
3695 &addrlen); 3701 &addrlen);
3696#ifdef MHD_ACCEPT_INHERIT_NONBLOCK 3702#ifdef MHD_ACCEPT_INHERIT_NONBLOCK
3697 sk_nonbl = daemon->listen_nonblk; 3703 sk_nonbl = daemon->listen_nonblk;
@@ -3821,7 +3827,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
3821#endif 3827#endif
3822 (void) internal_add_connection (daemon, 3828 (void) internal_add_connection (daemon,
3823 s, 3829 s,
3824 addr, 3830 &addrstorage,
3825 addrlen, 3831 addrlen,
3826 false, 3832 false,
3827 sk_nonbl, 3833 sk_nonbl,