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))

Reply via email to