git: c0f892003486 - stable/15 - sys/socket.h: Fix AF_MAX

Dag-Erling Smørgrav <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a75feac.1e065.753a4ed7__43215.6383105152$1786117820$gmane$org@gitrepo.freebsd.org>
The branch stable/15 has been updated by des:

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

commit c0f892003486548a8f68e86b467b7e84f56b9fe0
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-07 15:46:41 +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
    
    (cherry picked from commit ddd850aa7720f77b6605599655df898b16ed74cc)
---
 lib/libifconfig/libifconfig.c          | 4 ++--
 lib/libifconfig/libifconfig_internal.c | 2 +-
 sys/kern/vfs_export.c                  | 2 +-
 sys/net/route.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 f844ae235a71..9b2f1fd753c8 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 bd7caa01e153..2193723322c2 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -160,7 +160,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.c b/sys/net/route.c
index d2c9f3e39c17..473487b54e31 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -520,7 +520,7 @@ rt_updatemtu(struct ifnet *ifp)
 	 * Unfortunately the only way to do this is to traverse all
 	 * routing tables in all fibs/domains.
 	 */
-	for (i = 1; i <= AF_MAX; i++) {
+	for (i = 1; i < AF_MAX; i++) {
 		mtu = if_getmtu_family(ifp, i);
 		for (j = 0; j < rt_numfibs; j++) {
 			rnh = rt_tables_get_rnh(j, i);
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 2c0df15b04b7..bee01f28a81d 100644
--- a/sys/net/route/route_helpers.c
+++ b/sys/net/route/route_helpers.c
@@ -184,7 +184,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);
 	}
 }
@@ -206,7 +206,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 de4c3f8c6374..a0c46ea24d5d 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -2620,7 +2620,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];
@@ -2644,7 +2644,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 ce62aad1f81b..ca647876d0ad 100644
--- a/sys/netlink/route/rt.c
+++ b/sys/netlink/route/rt.c
@@ -973,7 +973,7 @@ rtnl_handle_newroute(struct nlmsghdr *hdr, struct nlpcb *nlp,
 	/* pre-2.6.19 Linux API compatibility */
 	if (attrs.rtm_table > 0 && attrs.rta_table == 0)
 		attrs.rta_table = attrs.rtm_table;
-	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);
 	}
@@ -1036,7 +1036,7 @@ rtnl_handle_delroute(struct nlmsghdr *hdr, struct nlpcb *nlp,
 		return (ESRCH);
 	}
 
-	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);
 	}
@@ -1059,7 +1059,7 @@ rtnl_handle_getroute(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *
 	if (error != 0)
 		return (error);
 
-	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 cdd4fa3b4b89..df35224785d3 100644
--- a/sys/sys/socket.h
+++ b/sys/sys/socket.h
@@ -271,7 +271,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_
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.