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; }