Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Re: assert interface list locking
To:
Alexander Bluhm <bluhm@openbsd.org>
Cc:
tech@openbsd.org
Date:
Fri, 14 Nov 2025 00:11:46 +0300

Download raw body.

Thread
On Tue, Nov 11, 2025 at 03:38:50PM +0100, Alexander Bluhm wrote:
> Hi,
> 
> Traversing ifnetlist needs either kernel lock or shared net lock.
> I have added some asserts to check that.
> 
> ok?
> 

Yes, please.

> bluhm
> 
> Index: net/if.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/net/if.c,v
> diff -u -p -r1.745 if.c
> --- net/if.c	11 Nov 2025 07:56:50 -0000	1.745
> +++ net/if.c	11 Nov 2025 14:35:17 -0000
> @@ -1389,6 +1389,7 @@ if_clone_destroy(const char *name)
>  	if (ifc->ifc_destroy == NULL)
>  		return (EOPNOTSUPP);
>  
> +	KERNEL_ASSERT_LOCKED();
>  	rw_enter_write(&if_cloners_lock);
>  
>  	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
> @@ -2735,6 +2736,8 @@ ifconf(caddr_t data)
>  	struct ifaddr *ifa;
>  	struct ifreq ifr, *ifrp;
>  	int space = ifc->ifc_len, error = 0;
> +
> +	NET_ASSERT_LOCKED();
>  
>  	/* If ifc->ifc_len is 0, fill it in with the needed size and return. */
>  	if (space == 0) {
> Index: netinet/in.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in.c,v
> diff -u -p -r1.187 in.c
> --- netinet/in.c	8 Jul 2025 00:47:41 -0000	1.187
> +++ netinet/in.c	11 Nov 2025 14:35:17 -0000
> @@ -801,6 +801,8 @@ in_broadcast(struct in_addr in, u_int rt
>  	struct ifaddr *ifa;
>  	u_int rdomain;
>  
> +	NET_ASSERT_LOCKED();
> +
>  	rdomain = rtable_l2(rtableid);
>  
>  #define ia (ifatoia(ifa))
> Index: netinet6/in6.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6.c,v
> diff -u -p -r1.273 in6.c
> --- netinet6/in6.c	16 Sep 2025 09:18:29 -0000	1.273
> +++ netinet6/in6.c	11 Nov 2025 14:35:17 -0000
> @@ -1336,6 +1336,8 @@ in6_ifawithscope(struct ifnet *oifp, con
>  		return (NULL);
>  	}
>  
> +	NET_ASSERT_LOCKED();
> +
>  	/* We search for all addresses on all interfaces from the beginning. */
>  	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
>  		if (ifp->if_rdomain != rdomain)
> Index: netinet6/in6_ifattach.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6_ifattach.c,v
> diff -u -p -r1.124 in6_ifattach.c
> --- netinet6/in6_ifattach.c	8 Jul 2025 00:47:41 -0000	1.124
> +++ netinet6/in6_ifattach.c	11 Nov 2025 14:35:17 -0000
> @@ -199,6 +199,8 @@ in6_get_ifid(struct ifnet *ifp0, struct 
>  	if (in6_get_hw_ifid(ifp0, in6) == 0)
>  		return;
>  
> +	NET_ASSERT_LOCKED();
> +
>  	/* next, try to get it from some other hardware interface */
>  	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
>  		if (ifp == ifp0)
> Index: netinet6/ip6_mroute.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_mroute.c,v
> diff -u -p -r1.155 ip6_mroute.c
> --- netinet6/ip6_mroute.c	16 Sep 2025 09:18:55 -0000	1.155
> +++ netinet6/ip6_mroute.c	11 Nov 2025 14:35:17 -0000
> @@ -1232,6 +1232,8 @@ mrt6_iflookupbymif(mifi_t mifi, unsigned
>  	struct mif6	*m6;
>  	struct ifnet	*ifp;
>  
> +	NET_ASSERT_LOCKED();
> +
>  	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
>  		if (ifp->if_rdomain != rtableid)
>  			continue;
>