commit 2edd250dd96801661e3eba82e6b3ee229563f38f from: Omar Polo via: Thomas Adam date: Thu Nov 16 00:48:47 2023 UTC gotadmin: get rid of got_sockaddr.[ch] usage It was added due to gotwebd weird structure sockaddr_storage handling. Instead, save the size reported by getaddrinfo() and not reach into the struct sockaddr_storage at all (except for extracting the port number for diagnostics purposes.) sockets_conf_new_socket_fcgi() gets an hardcoded ipproto to zero (which is the only value it can get in practice, and keeps for the moment the hardcoded SOCK_STREAM. It'll be cleaned in a follow-up. ok stsp@ commit - ac485591d020cd11cf0c53e192975f115a9dc40a commit + 2edd250dd96801661e3eba82e6b3ee229563f38f blob - ceff3ccc3774187d7c67e2047b1d3cb47319b9ec blob + 31f76418205c391a63e56e0b2fd815181d3eb53d --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -265,7 +265,7 @@ struct fcgi_end_request_body { struct address { TAILQ_ENTRY(address) entry; struct sockaddr_storage ss; - int ipproto; + socklen_t slen; in_port_t port; char ifname[IFNAMSIZ]; }; blob - ef0410f51260026ece5a8095d5edb93f736def79 blob + 0c4efffac51447f247923bec579926305bb63c84 --- gotwebd/parse.y +++ gotwebd/parse.y @@ -48,7 +48,6 @@ #include #include -#include "got_sockaddr.h" #include "got_reference.h" #include "proc.h" @@ -1004,8 +1003,8 @@ get_addrs(const char *hostname, const char *servname, { struct addrinfo hints, *res0, *res; int error; - struct sockaddr_in *sain, *ra; - struct sockaddr_in6 *sin6, *ra6; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; struct address *h; memset(&hints, 0, sizeof(hints)); @@ -1036,19 +1035,18 @@ get_addrs(const char *hostname, const char *servname, } } h->ss.ss_family = res->ai_family; + + memcpy(&h->ss, res->ai_addr, res->ai_addrlen); + h->slen = res->ai_addrlen; switch (res->ai_family) { case AF_INET: - sain = (struct sockaddr_in *)&h->ss; - ra = (struct sockaddr_in *)res->ai_addr; - h->port = ntohs(ra->sin_port); - got_sockaddr_inet_init(sain, &ra->sin_addr); + sin = (struct sockaddr_in *)res->ai_addr; + h->port = ntohs(sin->sin_port); break; case AF_INET6: - sin6 = (struct sockaddr_in6 *)&h->ss; - ra6 = (struct sockaddr_in6 *)res->ai_addr; - h->port = ntohs(ra6->sin6_port); - got_sockaddr_inet6_init(sin6, &ra6->sin6_addr, 0); + sin6 = (struct sockaddr_in6 *)res->ai_addr; + h->port = ntohs(sin6->sin6_port); break; default: fatalx("unknown address family %d", res->ai_family); @@ -1071,8 +1069,8 @@ addr_dup_check(struct addresslist *al, struct address const char *addrstr; TAILQ_FOREACH(a, al, entry) { - if (memcmp(&a->ss, &h->ss, sizeof(h->ss)) != 0 || - a->port != h->port) + if (a->slen != h->slen || + memcmp(&a->ss, &h->ss, a->slen) != 0) continue; switch (h->ss.ss_family) { blob - 17c797a987157d3e18fd32773d765f8c270c2938 blob + 993b8723662b4b9475af9a1db9e910d80afee90c --- gotwebd/sockets.c +++ gotwebd/sockets.c @@ -230,7 +230,7 @@ sockets_conf_new_socket_fcgi(struct gotwebd *env, stru acp = &sock->conf.addr; memcpy(&acp->ss, &a->ss, sizeof(acp->ss)); - acp->ipproto = a->ipproto; + acp->slen = a->slen; acp->port = a->port; if (*a->ifname != '\0') { if (strlcpy(acp->ifname, a->ifname, @@ -510,19 +510,7 @@ sockets_create_socket(struct address *a, in_port_t por hints.ai_socktype = SOCK_STREAM; hints.ai_flags |= AI_PASSIVE; - switch (a->ss.ss_family) { - case AF_INET: - ((struct sockaddr_in *)(&a->ss))->sin_port = htons(port); - break; - case AF_INET6: - ((struct sockaddr_in6 *)(&a->ss))->sin6_port = htons(port); - break; - default: - log_warnx("%s: unknown address family", __func__); - return -1; - } - - fd = socket(a->ss.ss_family, hints.ai_socktype, a->ipproto); + fd = socket(a->ss.ss_family, hints.ai_socktype, 0); if (fd == -1) return -1; @@ -545,7 +533,7 @@ sockets_create_socket(struct address *a, in_port_t por return -1; } - if (bind(fd, (struct sockaddr *)&a->ss, SS_LEN(&a->ss)) == -1) { + if (bind(fd, (struct sockaddr *)&a->ss, a->slen) == -1) { close(fd); log_info("%s: can't bind to port %d", __func__, ntohs(port)); blob - 809c5c9b65985619eabf4ad948d80348f606762c (mode 644) blob + /dev/null --- include/got_sockaddr.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2022 Stefan Sperling - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void got_sockaddr_inet_init(struct sockaddr_in *in, struct in_addr *ina); -void got_sockaddr_inet6_init(struct sockaddr_in6 *in6, struct in6_addr *in6a, - uint32_t sin6_scope_id); blob - 7a76593a59f98468b3891e3823c6d7fd0cfa960d (mode 644) blob + /dev/null --- lib/sockaddr.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2022 Stefan Sperling - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#include - -#include "got_sockaddr.h" - -/* - * These interfaces wrap BSD-specific internals of internet address - * data structures in a single compilation unit, allowing got-portable - * to override them as needed, without a need for #ifdef macros. - */ - -void -got_sockaddr_inet_init(struct sockaddr_in *in, struct in_addr *ina) -{ - in->sin_len = sizeof(struct sockaddr_in); /* BSD-specific */ - in->sin_family = AF_INET; - in->sin_addr.s_addr = ina->s_addr; -} - -void -got_sockaddr_inet6_init(struct sockaddr_in6 *in6, struct in6_addr *in6a, - uint32_t sin6_scope_id) -{ - in6->sin6_len = sizeof(struct sockaddr_in6); /* BSD-specific */ - in6->sin6_family = AF_INET6; - memcpy(&in6->sin6_addr, in6a, sizeof(in6->sin6_addr)); - in6->sin6_scope_id = sin6_scope_id; -}