The branch main has been updated by des:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ddd850aa7720f77b6605599655df898b16ed74cc

commit ddd850aa7720f77b6605599655df898b16ed74cc
Author:     Dag-Erling Smørgrav <[email protected]>
AuthorDate: 2026-08-04 09:55:22 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2026-08-04 09:55:22 +0000

    sys/socket.h: Fix AF_MAX
    
    AF_MAX was always intended to be one more than the greatest allocated
    value.  Jeff broke this in 2013.  Unfortunately, a bunch of people then
    decided to adapt to the mistake instead of correcting it.
    
    Fixes:          863c7e45628d (" - Reserve a special AF for SDP.  The one we 
were incorrectly using before    was taken by another AF.")
    MFC after:      3 days
    Sponsored by:   Klara, Inc.
    Sponsored by:   NetApp, Inc.
    Reviewed by:    kevans, glebius
    Differential Revision:  https://reviews.freebsd.org/D58597
---
 lib/libifconfig/libifconfig.c          | 4 ++--
 lib/libifconfig/libifconfig_internal.c | 2 +-
 sys/kern/vfs_export.c                  | 2 +-
 sys/net/route/nhop_ctl.c               | 2 +-
 sys/net/route/route_ddb.c              | 2 +-
 sys/net/route/route_helpers.c          | 4 ++--
 sys/net/rtsock.c                       | 4 ++--
 sys/netlink/route/rt.c                 | 6 +++---
 sys/sys/socket.h                       | 4 +++-
 9 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/lib/libifconfig/libifconfig.c b/lib/libifconfig/libifconfig.c
index bc0fcb6021b2..b450c15180db 100644
--- a/lib/libifconfig/libifconfig.c
+++ b/lib/libifconfig/libifconfig.c
@@ -81,7 +81,7 @@ ifconfig_open(void)
        if (h == NULL) {
                return (NULL);
        }
-       for (int i = 0; i <= AF_MAX; i++) {
+       for (int i = 0; i < AF_MAX; i++) {
                h->sockets[i] = -1;
        }
 
@@ -92,7 +92,7 @@ void
 ifconfig_close(ifconfig_handle_t *h)
 {
 
-       for (int i = 0; i <= AF_MAX; i++) {
+       for (int i = 0; i < AF_MAX; i++) {
                if (h->sockets[i] != -1) {
                        (void)close(h->sockets[i]);
                }
diff --git a/lib/libifconfig/libifconfig_internal.c 
b/lib/libifconfig/libifconfig_internal.c
index c6c955debb3d..91de1ece59fb 100644
--- a/lib/libifconfig/libifconfig_internal.c
+++ b/lib/libifconfig/libifconfig_internal.c
@@ -78,7 +78,7 @@ int
 ifconfig_socket(ifconfig_handle_t *h, const int addressfamily, int *s)
 {
 
-       if (addressfamily > AF_MAX) {
+       if (addressfamily >= AF_MAX) {
                h->error.errtype = SOCKET;
                h->error.errcode = EINVAL;
                return (-1);
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index 6dc4eafc4c60..ca5b66426c5c 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -146,7 +146,7 @@ vfs_hang_addrlist(struct mount *mp, struct netexport *nep,
        saddr = (struct sockaddr *) (np + 1);
        if ((error = copyin(argp->ex_addr, saddr, argp->ex_addrlen)))
                goto out;
-       if (saddr->sa_family == AF_UNSPEC || saddr->sa_family > AF_MAX) {
+       if (saddr->sa_family == AF_UNSPEC || saddr->sa_family >= AF_MAX) {
                error = EINVAL;
                vfs_mount_error(mp, "Invalid saddr->sa_family: %d");
                goto out;
diff --git a/sys/net/route/nhop_ctl.c b/sys/net/route/nhop_ctl.c
index f34721c888b4..59a81ecde4df 100644
--- a/sys/net/route/nhop_ctl.c
+++ b/sys/net/route/nhop_ctl.c
@@ -1339,7 +1339,7 @@ nhops_ifnet_state_changed(struct ifnet *ifp, bool status)
        struct nhop_iter iter = { .fibnum = ifp->if_fib, .wlock = true };
        bool nhops_changed;
 
-       for (iter.family = 1; iter.family <= AF_MAX; iter.family++) {
+       for (iter.family = 1; iter.family < AF_MAX; iter.family++) {
                /*
                 * By tracking nhop changes, we avoid redundant nhgrp
                 * recompilation triggered by multiple events.
diff --git a/sys/net/route/route_ddb.c b/sys/net/route/route_ddb.c
index 71bffd98663b..c93370d0a570 100644
--- a/sys/net/route/route_ddb.c
+++ b/sys/net/route/route_ddb.c
@@ -174,7 +174,7 @@ DB_SHOW_COMMAND(routetable, db_show_routetable)
                i = lim = addr;
        else {
                i = 1;
-               lim = AF_MAX;
+               lim = AF_MAX - 1;
        }
 
        for (; i <= lim; i++) {
diff --git a/sys/net/route/route_helpers.c b/sys/net/route/route_helpers.c
index f09a8bbbd3e5..9160a5872534 100644
--- a/sys/net/route/route_helpers.c
+++ b/sys/net/route/route_helpers.c
@@ -183,7 +183,7 @@ rib_foreach_table_walk(int family, bool wlock, 
rib_walktree_f_t *wa_f,
                        continue;
                }
 
-               for (int i = 1; i <= AF_MAX; i++)
+               for (int i = 1; i < AF_MAX; i++)
                        rib_walk_ext(fibnum, i, wlock, wa_f, hook_f, arg);
        }
 }
@@ -205,7 +205,7 @@ rib_foreach_table_walk_del(int family, rib_filter_f_t 
*filter_f, void *arg)
                        continue;
                }
 
-               for (int i = 1; i <= AF_MAX; i++)
+               for (int i = 1; i < AF_MAX; i++)
                        rib_walk_del(fibnum, i, filter_f, arg, 0);
        }
 }
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 47da83b5561b..fcccbc98470c 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -2623,7 +2623,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
        } else if (namelen != 3)
                return ((namelen < 3) ? EISDIR : ENOTDIR);
        af = name[0];
-       if (af > AF_MAX)
+       if (af >= AF_MAX)
                return (EINVAL);
        bzero(&w, sizeof(w));
        w.w_op = name[1];
@@ -2647,7 +2647,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
        case NET_RT_FLAGS:
                if (af == 0) {                  /* dump all tables */
                        i = 1;
-                       lim = AF_MAX;
+                       lim = AF_MAX - 1;
                } else                          /* dump only one table */
                        i = lim = af;
 
diff --git a/sys/netlink/route/rt.c b/sys/netlink/route/rt.c
index fbd96bb9fdc6..bf6ef035eb1d 100644
--- a/sys/netlink/route/rt.c
+++ b/sys/netlink/route/rt.c
@@ -1053,7 +1053,7 @@ rtnl_handle_newroute(struct nlmsghdr *hdr, struct nlpcb 
*nlp,
        }
 
        old_linux_compat(&attrs);
-       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family > AF_MAX) {
+       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family >= AF_MAX) {
                NLMSG_REPORT_ERR_MSG(npt, "invalid fib");
                return (EINVAL);
        }
@@ -1120,7 +1120,7 @@ rtnl_handle_delroute(struct nlmsghdr *hdr, struct nlpcb 
*nlp,
        }
 
        old_linux_compat(&attrs);
-       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family > AF_MAX) {
+       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family >= AF_MAX) {
                NLMSG_REPORT_ERR_MSG(npt, "invalid fib");
                return (EINVAL);
        }
@@ -1144,7 +1144,7 @@ rtnl_handle_getroute(struct nlmsghdr *hdr, struct nlpcb 
*nlp, struct nl_pstate *
                return (error);
 
        old_linux_compat(&attrs);
-       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family > AF_MAX) {
+       if (attrs.rta_table >= V_rt_numfibs || attrs.rtm_family >= AF_MAX) {
                NLMSG_REPORT_ERR_MSG(npt, "invalid fib");
                return (EINVAL);
        }
diff --git a/sys/sys/socket.h b/sys/sys/socket.h
index d9c31d572b4f..cc910a2a8efa 100644
--- a/sys/sys/socket.h
+++ b/sys/sys/socket.h
@@ -272,7 +272,9 @@ struct accept_filter_arg {
 #define        AF_HYPERV       43              /* HyperV sockets */
 #define        AF_DIVERT       44              /* divert(4) */
 #define        AF_IPFWLOG      46
-#define        AF_MAX          46
+
+#define        AF_MAX          47
+
 /*
  * When allocating a new AF_ constant, please only allocate
  * even numbered constants for FreeBSD until 134 as odd numbered AF_

Reply via email to