diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2022-08-15 15:34:17 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2022-08-15 16:21:45 +0300 |
commit | 25863e1c897b63eb56d248fde9634d0477ca8830 (patch) | |
tree | 7ce86054b86a0c3fcfe29f87af41309c3d0c12fa | |
parent | b115e254b32f58dea98a0f30ad1510c3223b8a1b (diff) | |
download | libmicrohttpd-25863e1c897b63eb56d248fde9634d0477ca8830.tar.gz libmicrohttpd-25863e1c897b63eb56d248fde9634d0477ca8830.zip |
daemon.c: fixed and simplified sockaddr alignment handling
-rw-r--r-- | src/microhttpd/daemon.c | 64 | ||||
-rw-r--r-- | src/microhttpd/internal.h | 2 |
2 files changed, 36 insertions, 30 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 | */ |
323 | static enum MHD_Result | 323 | static enum MHD_Result |
324 | MHD_ip_addr_to_key (const struct sockaddr *addr, | 324 | MHD_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 | */ |
378 | static enum MHD_Result | 376 | static enum MHD_Result |
379 | MHD_ip_limit_add (struct MHD_Daemon *daemon, | 377 | MHD_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 | */ |
446 | static void | 444 | static void |
447 | MHD_ip_limit_del (struct MHD_Daemon *daemon, | 445 | MHD_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, | |||
2423 | static struct MHD_Connection * | 2421 | static struct MHD_Connection * |
2424 | new_connection_prepare_ (struct MHD_Daemon *daemon, | 2422 | new_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, | |||
2964 | static enum MHD_Result | 2962 | static enum MHD_Result |
2965 | internal_add_connection (struct MHD_Daemon *daemon, | 2963 | internal_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, | |||
3650 | static enum MHD_Result | 3656 | static enum MHD_Result |
3651 | MHD_accept_connection (struct MHD_Daemon *daemon) | 3657 | MHD_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, |
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h index e91369ad..35620bff 100644 --- a/src/microhttpd/internal.h +++ b/src/microhttpd/internal.h | |||
@@ -1236,7 +1236,7 @@ struct MHD_Connection | |||
1236 | * Foreign address (of length @e addr_len). MALLOCED (not | 1236 | * Foreign address (of length @e addr_len). MALLOCED (not |
1237 | * in pool!). | 1237 | * in pool!). |
1238 | */ | 1238 | */ |
1239 | struct sockaddr *addr; | 1239 | struct sockaddr_storage *addr; |
1240 | 1240 | ||
1241 | #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) | 1241 | #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) |
1242 | /** | 1242 | /** |