Module Name:    src
Committed By:   knakahara
Date:           Thu Jun 21 10:37:50 UTC 2018

Modified Files:
        src/sys/net: if.h
        src/sys/netinet: igmp.c in_l2tp.c ip_encap.c ip_icmp.c ip_mroute.c
        src/sys/netinet6: in6_l2tp.c ip6_mroute.c

Log Message:
sbappendaddr() is required any lock. Currently, softnet_lock is appropriate.

When rip_input() is called as inetsw[].pr_input, rip_iput() is always called
with holding softnet_lock, that is, in case of !defined(NET_MPSAFE) it is
acquired in ipintr(), otherwise(defined(NET_MPSAFE)) it is acquire in
PR_WRAP_INPUT macro.
However, some function calls rip_input() directly without holding softnet_lock.
That causes assertion failure in sbappendaddr().
rip6_input() and icmp6_rip6_input() are also required softnet_lock for the same
reason.


To generate a diff of this commit:
cvs rdiff -u -r1.262 -r1.263 src/sys/net/if.h
cvs rdiff -u -r1.67 -r1.68 src/sys/netinet/igmp.c
cvs rdiff -u -r1.14 -r1.15 src/sys/netinet/in_l2tp.c
cvs rdiff -u -r1.68 -r1.69 src/sys/netinet/ip_encap.c
cvs rdiff -u -r1.171 -r1.172 src/sys/netinet/ip_icmp.c
cvs rdiff -u -r1.159 -r1.160 src/sys/netinet/ip_mroute.c
cvs rdiff -u -r1.15 -r1.16 src/sys/netinet6/in6_l2tp.c
cvs rdiff -u -r1.128 -r1.129 src/sys/netinet6/ip6_mroute.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if.h
diff -u src/sys/net/if.h:1.262 src/sys/net/if.h:1.263
--- src/sys/net/if.h:1.262	Tue Jun 12 07:12:35 2018
+++ src/sys/net/if.h	Thu Jun 21 10:37:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.h,v 1.262 2018/06/12 07:12:35 ozaki-r Exp $	*/
+/*	$NetBSD: if.h,v 1.263 2018/06/21 10:37:49 knakahara Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -535,6 +535,11 @@ if_is_link_state_changeable(struct ifnet
 #define SOFTNET_LOCK_UNLESS_NET_MPSAFE()	do { } while (0)
 #define SOFTNET_UNLOCK_UNLESS_NET_MPSAFE()	do { } while (0)
 
+#define SOFTNET_LOCK_IF_NET_MPSAFE()					\
+	do { mutex_enter(softnet_lock); } while (0)
+#define SOFTNET_UNLOCK_IF_NET_MPSAFE()					\
+	do { mutex_exit(softnet_lock); } while (0)
+
 #else /* NET_MPSAFE */
 
 #define KERNEL_LOCK_UNLESS_NET_MPSAFE()					\
@@ -547,6 +552,9 @@ if_is_link_state_changeable(struct ifnet
 #define SOFTNET_UNLOCK_UNLESS_NET_MPSAFE()				\
 	do { mutex_exit(softnet_lock); } while (0)
 
+#define SOFTNET_LOCK_IF_NET_MPSAFE()		do { } while (0)
+#define SOFTNET_UNLOCK_IF_NET_MPSAFE()		do { } while (0)
+
 #endif /* NET_MPSAFE */
 
 #define SOFTNET_KERNEL_LOCK_UNLESS_NET_MPSAFE()				\

Index: src/sys/netinet/igmp.c
diff -u src/sys/netinet/igmp.c:1.67 src/sys/netinet/igmp.c:1.68
--- src/sys/netinet/igmp.c:1.67	Tue Apr 10 08:22:35 2018
+++ src/sys/netinet/igmp.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: igmp.c,v 1.67 2018/04/10 08:22:35 maxv Exp $	*/
+/*	$NetBSD: igmp.c,v 1.68 2018/06/21 10:37:50 knakahara Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: igmp.c,v 1.67 2018/04/10 08:22:35 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: igmp.c,v 1.68 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_mrouting.h"
@@ -474,6 +474,11 @@ igmp_input(struct mbuf *m, ...)
 	 * Pass all valid IGMP packets up to any process(es) listening
 	 * on a raw IGMP socket.
 	 */
+	/*
+	 * Currently, igmp_input() is always called holding softnet_lock
+	 * by ipintr()(!NET_MPSAFE) or PR_INPUT_WRAP()(NET_MPSAFE).
+	 */
+	KASSERT(mutex_owned(softnet_lock));
 	rip_input(m, iphlen, proto);
 	return;
 

Index: src/sys/netinet/in_l2tp.c
diff -u src/sys/netinet/in_l2tp.c:1.14 src/sys/netinet/in_l2tp.c:1.15
--- src/sys/netinet/in_l2tp.c:1.14	Tue May  1 07:21:39 2018
+++ src/sys/netinet/in_l2tp.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_l2tp.c,v 1.14 2018/05/01 07:21:39 maxv Exp $	*/
+/*	$NetBSD: in_l2tp.c,v 1.15 2018/06/21 10:37:50 knakahara Exp $	*/
 
 /*
  * Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_l2tp.c,v 1.14 2018/05/01 07:21:39 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_l2tp.c,v 1.15 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_l2tp.h"
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: in_l2tp.c,v 
 #include <sys/ioctl.h>
 #include <sys/syslog.h>
 #include <sys/kernel.h>
+#include <sys/socketvar.h> /* For softnet_lock */
 
 #include <net/if.h>
 #include <net/route.h>
@@ -275,7 +276,9 @@ in_l2tp_input(struct mbuf *m, int off, i
 		 * L2TPv3 control packet received.
 		 * userland daemon(l2tpd?) should process.
 		 */
+		SOFTNET_LOCK_IF_NET_MPSAFE();
 		rip_input(m, off, proto);
+		SOFTNET_UNLOCK_IF_NET_MPSAFE();
 		return;
 	}
 

Index: src/sys/netinet/ip_encap.c
diff -u src/sys/netinet/ip_encap.c:1.68 src/sys/netinet/ip_encap.c:1.69
--- src/sys/netinet/ip_encap.c:1.68	Tue May  1 07:21:39 2018
+++ src/sys/netinet/ip_encap.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_encap.c,v 1.68 2018/05/01 07:21:39 maxv Exp $	*/
+/*	$NetBSD: ip_encap.c,v 1.69 2018/06/21 10:37:50 knakahara Exp $	*/
 /*	$KAME: ip_encap.c,v 1.73 2001/10/02 08:30:58 itojun Exp $	*/
 
 /*
@@ -68,7 +68,7 @@
 #define USE_RADIX
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.68 2018/05/01 07:21:39 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.69 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_mrouting.h"
@@ -372,7 +372,9 @@ encap4_input(struct mbuf *m, ...)
 	}
 
 	/* last resort: inject to raw socket */
+	SOFTNET_LOCK_IF_NET_MPSAFE();
 	rip_input(m, off, proto);
+	SOFTNET_UNLOCK_IF_NET_MPSAFE();
 }
 #endif
 
@@ -494,6 +496,7 @@ encap6_input(struct mbuf **mp, int *offp
 	const struct encapsw *esw;
 	struct encaptab *match;
 	struct psref match_psref;
+	int rv;
 
 	match = encap6_lookup(m, *offp, proto, INBOUND, &match_psref);
 
@@ -516,7 +519,10 @@ encap6_input(struct mbuf **mp, int *offp
 	}
 
 	/* last resort: inject to raw socket */
-	return rip6_input(mp, offp, proto);
+	SOFTNET_LOCK_IF_NET_MPSAFE();
+	rv = rip6_input(mp, offp, proto);
+	SOFTNET_UNLOCK_IF_NET_MPSAFE();
+	return rv;
 }
 #endif
 

Index: src/sys/netinet/ip_icmp.c
diff -u src/sys/netinet/ip_icmp.c:1.171 src/sys/netinet/ip_icmp.c:1.172
--- src/sys/netinet/ip_icmp.c:1.171	Fri Jun  1 07:13:35 2018
+++ src/sys/netinet/ip_icmp.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_icmp.c,v 1.171 2018/06/01 07:13:35 ozaki-r Exp $	*/
+/*	$NetBSD: ip_icmp.c,v 1.172 2018/06/21 10:37:50 knakahara Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -94,7 +94,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.171 2018/06/01 07:13:35 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.172 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ipsec.h"
@@ -679,6 +679,11 @@ reflect:
 	}
 
 raw:
+	/*
+	 * Currently, pim_input() is always called holding softnet_lock
+	 * by ipintr()(!NET_MPSAFE) or PR_INPUT_WRAP()(NET_MPSAFE).
+	 */
+	KASSERT(mutex_owned(softnet_lock));
 	rip_input(m, hlen, proto);
 	return;
 

Index: src/sys/netinet/ip_mroute.c
diff -u src/sys/netinet/ip_mroute.c:1.159 src/sys/netinet/ip_mroute.c:1.160
--- src/sys/netinet/ip_mroute.c:1.159	Mon May 14 17:26:16 2018
+++ src/sys/netinet/ip_mroute.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_mroute.c,v 1.159 2018/05/14 17:26:16 maxv Exp $	*/
+/*	$NetBSD: ip_mroute.c,v 1.160 2018/06/21 10:37:50 knakahara Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.159 2018/05/14 17:26:16 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.160 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -3165,6 +3165,11 @@ pim_input_to_daemon:
 	 * XXX: the outer IP header pkt size of a Register is not adjust to
 	 * reflect the fact that the inner multicast data is truncated.
 	 */
+	/*
+	 * Currently, pim_input() is always called holding softnet_lock
+	 * by ipintr()(!NET_MPSAFE) or PR_INPUT_WRAP()(NET_MPSAFE).
+	 */
+	KASSERT(mutex_owned(softnet_lock));
 	rip_input(m, iphlen, proto);
 
 	return;

Index: src/sys/netinet6/in6_l2tp.c
diff -u src/sys/netinet6/in6_l2tp.c:1.15 src/sys/netinet6/in6_l2tp.c:1.16
--- src/sys/netinet6/in6_l2tp.c:1.15	Fri Apr 27 09:55:28 2018
+++ src/sys/netinet6/in6_l2tp.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_l2tp.c,v 1.15 2018/04/27 09:55:28 knakahara Exp $	*/
+/*	$NetBSD: in6_l2tp.c,v 1.16 2018/06/21 10:37:50 knakahara Exp $	*/
 
 /*
  * Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_l2tp.c,v 1.15 2018/04/27 09:55:28 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_l2tp.c,v 1.16 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_l2tp.h"
@@ -267,11 +267,15 @@ in6_l2tp_input(struct mbuf **mp, int *of
 	log(LOG_DEBUG, "%s: sess_id = %" PRIu32 "\n", __func__, sess_id);
 #endif
 	if (sess_id == 0) {
+		int rv;
 		/*
 		 * L2TPv3 control packet received.
 		 * userland daemon(l2tpd?) should process.
 		 */
-		return rip6_input(mp, offp, proto);
+		SOFTNET_LOCK_IF_NET_MPSAFE();
+		rv = rip6_input(mp, offp, proto);
+		SOFTNET_UNLOCK_IF_NET_MPSAFE();
+		return rv;
 	}
 
 	var = l2tp_lookup_session_ref(sess_id, &psref);

Index: src/sys/netinet6/ip6_mroute.c
diff -u src/sys/netinet6/ip6_mroute.c:1.128 src/sys/netinet6/ip6_mroute.c:1.129
--- src/sys/netinet6/ip6_mroute.c:1.128	Sun May 20 06:29:43 2018
+++ src/sys/netinet6/ip6_mroute.c	Thu Jun 21 10:37:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_mroute.c,v 1.128 2018/05/20 06:29:43 maxv Exp $	*/
+/*	$NetBSD: ip6_mroute.c,v 1.129 2018/06/21 10:37:50 knakahara Exp $	*/
 /*	$KAME: ip6_mroute.c,v 1.49 2001/07/25 09:21:18 jinmei Exp $	*/
 
 /*
@@ -117,7 +117,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.128 2018/05/20 06:29:43 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.129 2018/06/21 10:37:50 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1931,6 +1931,11 @@ pim6_input(struct mbuf **mp, int *offp, 
 	 * encapsulated ip6 header.
 	 */
 pim6_input_to_daemon:
+	/*
+	 * Currently, rip6_input() is always called holding softnet_lock
+	 * by ipintr()(!NET_MPSAFE) or PR_INPUT_WRAP()(NET_MPSAFE).
+	 */
+	KASSERT(mutex_owned(softnet_lock));
 	rip6_input(&m, offp, proto);
 	return IPPROTO_DONE;
 }

Reply via email to