2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-23 02:17:35 +00:00

Disable IPv4-mapped IPv6 addresses in the listener.

Also store the host + port string and use it in error messages.
This commit is contained in:
Todd C. Miller 2020-04-08 08:54:28 -06:00
parent 55eb0a633c
commit 18ff60f6ff
3 changed files with 17 additions and 1 deletions

View File

@ -1468,10 +1468,17 @@ create_listener(struct listen_address *addr)
goto bad; goto bad;
} }
on = 1; on = 1;
#ifdef IPV6_V6ONLY
if (addr->sa_un.sa.sa_family == AF_INET6) {
/* Disable IPv4-mapped IPv6 addresses. */
if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) == -1)
sudo_warn("IPV6_V6ONLY");
}
#endif
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
sudo_warn("SO_REUSEADDR"); sudo_warn("SO_REUSEADDR");
if (bind(sock, &addr->sa_un.sa, addr->sa_len) == -1) { if (bind(sock, &addr->sa_un.sa, addr->sa_len) == -1) {
sudo_warn("bind"); sudo_warn("%s", addr->sa_str);
goto bad; goto bad;
} }
if (listen(sock, SOMAXCONN) == -1) { if (listen(sock, SOMAXCONN) == -1) {
@ -1483,6 +1490,8 @@ create_listener(struct listen_address *addr)
sudo_warn("fcntl(O_NONBLOCK)"); sudo_warn("fcntl(O_NONBLOCK)");
goto bad; goto bad;
} }
sudo_debug_printf(SUDO_DEBUG_INFO, "listening on %s (AF_INET%s)",
addr->sa_str, addr->sa_un.sa.sa_family == AF_INET6 ? "6" : "");
debug_return_int(sock); debug_return_int(sock);
bad: bad:

View File

@ -128,6 +128,7 @@ union sockaddr_union {
*/ */
struct listen_address { struct listen_address {
TAILQ_ENTRY(listen_address) entries; TAILQ_ENTRY(listen_address) entries;
char *sa_str;
union sockaddr_union sa_un; union sockaddr_union sa_un;
socklen_t sa_len; socklen_t sa_len;
}; };

View File

@ -410,6 +410,11 @@ cb_listen_address(struct logsrvd_config *config, const char *str)
sudo_warn(NULL); sudo_warn(NULL);
goto done; goto done;
} }
if ((addr->sa_str = strdup(str)) == NULL) {
sudo_warn(NULL);
free(addr);
goto done;
}
memcpy(&addr->sa_un, res->ai_addr, res->ai_addrlen); memcpy(&addr->sa_un, res->ai_addr, res->ai_addrlen);
addr->sa_len = res->ai_addrlen; addr->sa_len = res->ai_addrlen;
TAILQ_INSERT_TAIL(&config->server.addresses, addr, entries); TAILQ_INSERT_TAIL(&config->server.addresses, addr, entries);
@ -933,6 +938,7 @@ logsrvd_conf_free(struct logsrvd_config *config)
/* struct logsrvd_config_server */ /* struct logsrvd_config_server */
while ((addr = TAILQ_FIRST(&config->server.addresses))) { while ((addr = TAILQ_FIRST(&config->server.addresses))) {
TAILQ_REMOVE(&config->server.addresses, addr, entries); TAILQ_REMOVE(&config->server.addresses, addr, entries);
free(addr->sa_str);
free(addr); free(addr);
} }
free(config->server.pid_file); free(config->server.pid_file);