Module Name:    src
Committed By:   ozaki-r
Date:           Fri Jun  2 03:41:21 UTC 2017

Modified Files:
        src/sys/netinet: in_pcb_hdr.h tcp_output.c
        src/sys/netipsec: ipsec.c ipsec.h

Log Message:
Assert inph_locked on ipsec_pcb_skip_ipsec (was IPSEC_PCB_SKIP_IPSEC)

The assertion confirms SP caches are accessed under inph lock (solock).


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/netinet/in_pcb_hdr.h
cvs rdiff -u -r1.195 -r1.196 src/sys/netinet/tcp_output.c
cvs rdiff -u -r1.98 -r1.99 src/sys/netipsec/ipsec.c
cvs rdiff -u -r1.49 -r1.50 src/sys/netipsec/ipsec.h

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

Modified files:

Index: src/sys/netinet/in_pcb_hdr.h
diff -u src/sys/netinet/in_pcb_hdr.h:1.12 src/sys/netinet/in_pcb_hdr.h:1.13
--- src/sys/netinet/in_pcb_hdr.h:1.12	Tue Apr 25 05:44:11 2017
+++ src/sys/netinet/in_pcb_hdr.h	Fri Jun  2 03:41:20 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb_hdr.h,v 1.12 2017/04/25 05:44:11 ozaki-r Exp $	*/
+/*	$NetBSD: in_pcb_hdr.h,v 1.13 2017/06/02 03:41:20 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 2003 WIDE Project.
@@ -89,6 +89,7 @@ struct inpcb_hdr {
 LIST_HEAD(inpcbhead, inpcb_hdr);
 
 struct vestigial_inpcb;
+struct in6_addr;
 
 /* Hooks for vestigial pcb entries.
  * If vestigial entries exist for a table (TCP only)

Index: src/sys/netinet/tcp_output.c
diff -u src/sys/netinet/tcp_output.c:1.195 src/sys/netinet/tcp_output.c:1.196
--- src/sys/netinet/tcp_output.c:1.195	Fri Mar  3 07:13:06 2017
+++ src/sys/netinet/tcp_output.c	Fri Jun  2 03:41:20 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_output.c,v 1.195 2017/03/03 07:13:06 ozaki-r Exp $	*/
+/*	$NetBSD: tcp_output.c,v 1.196 2017/06/02 03:41:20 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -135,7 +135,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.195 2017/03/03 07:13:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.196 2017/06/02 03:41:20 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -361,7 +361,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg
 	if (inp) {
 #if defined(IPSEC)
 		if (ipsec_used &&
-		    !IPSEC_PCB_SKIP_IPSEC(inp->inp_sp, IPSEC_DIR_OUTBOUND))
+		    !ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND))
 			optlen += ipsec4_hdrsiz_tcp(tp);
 #endif
 		optlen += ip_optlen(inp);
@@ -372,7 +372,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg
 	if (in6p && tp->t_family == AF_INET) {
 #if defined(IPSEC)
 		if (ipsec_used &&
-		    !IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
+		    !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
 			optlen += ipsec4_hdrsiz_tcp(tp);
 #endif
 		/* XXX size -= ip_optlen(in6p); */
@@ -381,7 +381,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg
 	if (in6p && tp->t_family == AF_INET6) {
 #if defined(IPSEC)
 		if (ipsec_used &&
-		    !IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
+		    !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
 			optlen += ipsec6_hdrsiz_tcp(tp);
 #endif
 		optlen += ip6_optlen(in6p);
@@ -641,7 +641,7 @@ tcp_output(struct tcpcb *tp)
 #if defined(INET)
 	has_tso4 = tp->t_inpcb != NULL &&
 #if defined(IPSEC)
-	    (!ipsec_used || IPSEC_PCB_SKIP_IPSEC(tp->t_inpcb->inp_sp,
+	    (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_inpcb->inp_sp,
 	    IPSEC_DIR_OUTBOUND)) &&
 #endif
 	    (rt = rtcache_validate(&tp->t_inpcb->inp_route)) != NULL &&
@@ -654,7 +654,7 @@ tcp_output(struct tcpcb *tp)
 #if defined(INET6)
 	has_tso6 = tp->t_in6pcb != NULL &&
 #if defined(IPSEC)
-	    (!ipsec_used || IPSEC_PCB_SKIP_IPSEC(tp->t_in6pcb->in6p_sp,
+	    (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_in6pcb->in6p_sp,
 	    IPSEC_DIR_OUTBOUND)) &&
 #endif
 	    (rt = rtcache_validate(&tp->t_in6pcb->in6p_route)) != NULL &&

Index: src/sys/netipsec/ipsec.c
diff -u src/sys/netipsec/ipsec.c:1.98 src/sys/netipsec/ipsec.c:1.99
--- src/sys/netipsec/ipsec.c:1.98	Fri Jun  2 03:39:28 2017
+++ src/sys/netipsec/ipsec.c	Fri Jun  2 03:41:20 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.c,v 1.98 2017/06/02 03:39:28 ozaki-r Exp $	*/
+/*	$NetBSD: ipsec.c,v 1.99 2017/06/02 03:41:20 ozaki-r Exp $	*/
 /*	$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.c,v 1.2.2.2 2003/07/01 01:38:13 sam Exp $	*/
 /*	$KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.98 2017/06/02 03:39:28 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.99 2017/06/02 03:41:20 ozaki-r Exp $");
 
 /*
  * IPsec controller part.
@@ -673,7 +673,7 @@ ipsec4_output(struct mbuf *m, struct inp
 		return 0;
 	}
 	s = splsoftnet();
-	if (inp && IPSEC_PCB_SKIP_IPSEC(inp->inp_sp, IPSEC_DIR_OUTBOUND)) {
+	if (inp && ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) {
 		splx(s);
 		return 0;
 	}
@@ -2281,7 +2281,7 @@ ipsec6_check_policy(struct mbuf *m, stru
 	if (!ipsec_outdone(m)) {
 		s = splsoftnet();
 		if (in6p != NULL &&
-		    IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) {
+		    ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) {
 			splx(s);
 			goto skippolicycheck;
 		}

Index: src/sys/netipsec/ipsec.h
diff -u src/sys/netipsec/ipsec.h:1.49 src/sys/netipsec/ipsec.h:1.50
--- src/sys/netipsec/ipsec.h:1.49	Fri Jun  2 03:39:28 2017
+++ src/sys/netipsec/ipsec.h	Fri Jun  2 03:41:20 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.h,v 1.49 2017/06/02 03:39:28 ozaki-r Exp $	*/
+/*	$NetBSD: ipsec.h,v 1.50 2017/06/02 03:41:20 ozaki-r Exp $	*/
 /*	$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.h,v 1.2.4.2 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: ipsec.h,v 1.53 2001/11/20 08:32:38 itojun Exp $	*/
 
@@ -46,7 +46,9 @@
 #include <net/pfkeyv2.h>
 
 #ifdef _KERNEL
+#include <sys/socketvar.h>
 
+#include <netinet/in_pcb_hdr.h>
 #include <netipsec/keydb.h>
 
 /*
@@ -133,9 +135,17 @@ struct inpcbpolicy {
 	struct inpcb_hdr *sp_inph;	/* back pointer */
 };
 
-#define	IPSEC_PCB_SKIP_IPSEC(inpp, dir)					\
-	((inpp)->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO &&	\
-	 (inpp)->sp_cache[(dir)].cachegen == ipsec_spdgen)
+extern u_int ipsec_spdgen;
+
+static inline bool
+ipsec_pcb_skip_ipsec(struct inpcbpolicy *pcbsp, int dir)
+{
+
+	KASSERT(inph_locked(pcbsp->sp_inph));
+
+	return pcbsp->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO &&
+	    pcbsp->sp_cache[(dir)].cachegen == ipsec_spdgen;
+}
 
 /* SP acquiring list table. */
 struct secspacq {
@@ -257,8 +267,6 @@ void ipsec_pcbconn (struct inpcbpolicy *
 void ipsec_pcbdisconn (struct inpcbpolicy *);
 void ipsec_invalpcbcacheall (void);
 
-extern u_int ipsec_spdgen;
-
 struct tdb_ident;
 struct secpolicy *ipsec_getpolicy (const struct tdb_ident*, u_int);
 struct inpcb;

Reply via email to