From: Miroslav Lichvar Date: Mon, 29 Jun 2020 14:56:09 +0000 (+0200) Subject: nameserv: don't return scoped IPv6 addresses X-Git-Tag: 4.0-pre3~72 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59cf4e0b967ff1fedf2aae19a45bcd1ed75b74a6;p=thirdparty%2Fchrony.git nameserv: don't return scoped IPv6 addresses Ignore IPv6 addresses returned by getaddrinfo() that have a non-zero scope ID to avoid silently ignoring the ID if it was specified with the % sign in the provided string. This can be removed when the scope ID is returned from the function and the callers handle it. --- diff --git a/configure b/configure index 5e62a77f..5c4febff 100755 --- a/configure +++ b/configure @@ -657,6 +657,7 @@ if [ $feat_ipv6 = "1" ] && \ struct sockaddr_in6 n; char p[100]; n.sin6_addr = in6addr_any; + n.sin6_scope_id = 0; return !inet_ntop(AF_INET6, &n.sin6_addr.s6_addr, p, sizeof(p));' then add_def FEAT_IPV6 diff --git a/nameserv.c b/nameserv.c index c506b73b..c87aef08 100644 --- a/nameserv.c +++ b/nameserv.c @@ -95,6 +95,9 @@ DNS_Name2IPAddress(const char *name, IPAddr *ip_addrs, int max_addrs) case AF_INET6: if (address_family != IPADDR_UNSPEC && address_family != IPADDR_INET6) continue; + /* Don't return an address that would lose a scope ID */ + if (((struct sockaddr_in6 *)ai->ai_addr)->sin6_scope_id != 0) + continue; ip_addrs[i].family = IPADDR_INET6; memcpy(&ip_addrs[i].addr.in6, &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr.s6_addr, sizeof (ip_addrs->addr.in6));