Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 07 Aug 2026 15:50:10 +0000
From:      Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav <des@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 2d252764711b - stable/14 - sys/socket.h: Fix AF_MAX
Message-ID:  <6a75feb2.1e069.59ee0550@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/14 has been updated by des:

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

commit 2d252764711bebe09970507a30dff0f7641c6e0c
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2026-08-04 09:55:22 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2026-08-07 15:49:18 +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 96b4464436e3..5e8253c4f149 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -162,7 +162,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 d86f40dedec9..9543b3359a18 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -518,7 +518,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 e3116b8ee4b5..a8e62f5046ce 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -2605,7 +2605,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];
@@ -2629,7 +2629,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 fac174e01efd..810ed219df27 100644
--- a/sys/netlink/route/rt.c
+++ b/sys/netlink/route/rt.c
@@ -960,7 +960,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);
 	}
@@ -1023,7 +1023,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);
 	}
@@ -1046,7 +1046,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 b2afc735a383..ce6fe421d44b 100644
--- a/sys/sys/socket.h
+++ b/sys/sys/socket.h
@@ -271,7 +271,9 @@ struct accept_filter_arg {
 #define	AF_INET6_SDP	42		/* OFED Socket Direct Protocol ipv6 */
 #define	AF_HYPERV	43		/* HyperV sockets */
 #define	AF_DIVERT	44		/* divert(4) */
-#define	AF_MAX		44
+
+#define	AF_MAX		45
+
 /*
  * When allocating a new AF_ constant, please only allocate
  * even numbered constants for FreeBSD until 134 as odd numbered AF_


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a75feb2.1e069.59ee0550>