The branch main has been updated by bms: URL: https://cgit.FreeBSD.org/src/commit/?id=79eff4ad64fc445ea78ed733e16482c45dbd5b50
commit 79eff4ad64fc445ea78ed733e16482c45dbd5b50 Author: Bruce M Simpson <[email protected]> AuthorDate: 2026-02-14 15:36:47 +0000 Commit: Bruce M Simpson <[email protected]> CommitDate: 2026-02-14 16:00:58 +0000 netinet6: Return EAFNOSUPPORT for non-IPv6 addresses in mcast sockopts. This is a non-functional change; it just returns the correct errno value where IPv6 multicast socket options were passed non-AF_INET6 arguments, in preparation for handling PR 193246 with a side-call into netinet as xnu currently does. Reviewed by: glebius Approved by: glebius PR: 193246 (with refinements) Differential revision: https://reviews.freebsd.org/D55233 --- sys/netinet6/in6_mcast.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/sys/netinet6/in6_mcast.c b/sys/netinet6/in6_mcast.c index 4075e75eac85..4e770079e64e 100644 --- a/sys/netinet6/in6_mcast.c +++ b/sys/netinet6/in6_mcast.c @@ -1455,11 +1455,11 @@ in6p_block_unblock_source(struct inpcb *inp, struct sockopt *sopt) if (gsa->sin6.sin6_family != AF_INET6 || gsa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); if (ssa->sin6.sin6_family != AF_INET6 || ssa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); /* * XXXGL: this function should use ifnet_byindex_ref, or @@ -1684,7 +1684,7 @@ in6p_get_source_filters(struct inpcb *inp, struct sockopt *sopt) if (msfr.msfr_group.ss_family != AF_INET6 || msfr.msfr_group.ss_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); gsa = (sockunion_t *)&msfr.msfr_group; if (!IN6_IS_ADDR_MULTICAST(&gsa->sin6.sin6_addr)) @@ -1963,12 +1963,13 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) if (gsa->sin6.sin6_family != AF_INET6 || gsa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); if (sopt->sopt_name == MCAST_JOIN_SOURCE_GROUP) { if (ssa->sin6.sin6_family != AF_INET6 || ssa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); + if (IN6_IS_ADDR_MULTICAST(&ssa->sin6.sin6_addr)) return (EINVAL); /* @@ -2265,11 +2266,13 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *sopt) if (gsa->sin6.sin6_family != AF_INET6 || gsa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); + if (sopt->sopt_name == MCAST_LEAVE_SOURCE_GROUP) { if (ssa->sin6.sin6_family != AF_INET6 || ssa->sin6.sin6_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); + if (IN6_IS_ADDR_MULTICAST(&ssa->sin6.sin6_addr)) return (EINVAL); /* @@ -2509,7 +2512,7 @@ in6p_set_source_filters(struct inpcb *inp, struct sockopt *sopt) if (msfr.msfr_group.ss_family != AF_INET6 || msfr.msfr_group.ss_len != sizeof(struct sockaddr_in6)) - return (EINVAL); + return (EAFNOSUPPORT); gsa = (sockunion_t *)&msfr.msfr_group; if (!IN6_IS_ADDR_MULTICAST(&gsa->sin6.sin6_addr))
