The branch main has been updated by emaste: URL: https://cgit.FreeBSD.org/src/commit/?id=a1789fa30c0b1e4c20a083c550f0ec2d50e480e4
commit a1789fa30c0b1e4c20a083c550f0ec2d50e480e4 Author: Ed Maste <[email protected]> AuthorDate: 2026-01-27 21:29:20 +0000 Commit: Ed Maste <[email protected]> CommitDate: 2026-03-05 19:57:36 +0000 netinet6: Remove support for connecting to IN6ADDR_ANY RFC4291 section 2.5.2: The unspecified address must not be used as the destination address of IPv6 packets or in IPv6 Routing headers. An IPv6 packet with a source address of unspecified must never be forwarded by an IPv6 router. We disallowed connections to IN6ADDR_ANY by default, as of commit 627e126dbb07 ("netinet6: Disallow connections to IN6ADDR_ANY"). As this is actually disallowed by the RFC, just remove the support. Reported by: bz (in D54306) Reviewed by: bz, glebius Relnotes: yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D54942 --- sys/netinet6/in6_pcb.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 9eb7a59fcf55..d503165979c8 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -113,14 +113,6 @@ #include <netinet6/in6_fib.h> #include <netinet6/scope6_var.h> -SYSCTL_DECL(_net_inet6); -SYSCTL_DECL(_net_inet6_ip6); -VNET_DEFINE_STATIC(int, connect_in6addr_wild) = 0; -#define V_connect_in6addr_wild VNET(connect_in6addr_wild) -SYSCTL_INT(_net_inet6_ip6, OID_AUTO, connect_in6addr_wild, - CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(connect_in6addr_wild), 0, - "Allow connecting to the unspecified address for connect(2)"); - int in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred) { @@ -396,16 +388,9 @@ in6_pcbladdr(struct inpcb *inp, struct sockaddr_in6 *sin6, if ((error = sa6_embedscope(sin6, V_ip6_use_defzone)) != 0) return(error); - if (V_connect_in6addr_wild && !CK_STAILQ_EMPTY(&V_in6_ifaddrhead)) { - /* - * If the destination address is UNSPECIFIED addr, - * use the loopback addr, e.g ::1. - */ - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) - sin6->sin6_addr = in6addr_loopback; - } else if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + /* RFC4291 section 2.5.2 */ + if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) return (ENETUNREACH); - } if ((error = prison_remote_ip6(inp->inp_cred, &sin6->sin6_addr)) != 0) return (error);
