Sites with a misconfigured AAAA record pointing at an IPv6 link-local
address (the server's own NIC autoconf address leaked into public DNS by
a control panel) were refused entirely, even though their A record is
perfectly good. competa.com and upnano.com both do this.
is_private_hostname() refuses a hostname if ANY resolved address is
off-limits, because we cannot predict which one the fetcher will pick.
That reasoning does not hold for a bare fe80:: record: it is only
routable together with an interface scope, DNS cannot carry a zone id,
so getaddrinfo() returns it with sin6_scope_id == 0 and connect()
rejects it outright (EINVAL on Linux). Whichever address the fetcher
picks, the set of reachable hosts is the same - so refusing the name
cost legitimate sites and bought nothing.
Such records are now set aside rather than fatal, but only alongside at
least one usable address; a hostname resolving to nothing but link-local
space is still refused. IPv4 link-local (169.254.169.254 cloud metadata)
is untouched, a scoped literal (fe80::1%eth0, scope_id != 0) is
untouched, and CGNAT/private/reserved keep the any-record rule.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>