2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 01:49:11 +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;
}
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)
sudo_warn("SO_REUSEADDR");
if (bind(sock, &addr->sa_un.sa, addr->sa_len) == -1) {
sudo_warn("bind");
sudo_warn("%s", addr->sa_str);
goto bad;
}
if (listen(sock, SOMAXCONN) == -1) {
@ -1483,6 +1490,8 @@ create_listener(struct listen_address *addr)
sudo_warn("fcntl(O_NONBLOCK)");
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);
bad:

View File

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

View File

@ -410,6 +410,11 @@ cb_listen_address(struct logsrvd_config *config, const char *str)
sudo_warn(NULL);
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);
addr->sa_len = res->ai_addrlen;
TAILQ_INSERT_TAIL(&config->server.addresses, addr, entries);
@ -933,6 +938,7 @@ logsrvd_conf_free(struct logsrvd_config *config)
/* struct logsrvd_config_server */
while ((addr = TAILQ_FIRST(&config->server.addresses))) {
TAILQ_REMOVE(&config->server.addresses, addr, entries);
free(addr->sa_str);
free(addr);
}
free(config->server.pid_file);