Module Name:    src
Committed By:   ozaki-r
Date:           Tue Apr 25 05:44:11 UTC 2017

Modified Files:
        src/sys/netinet: in_pcb.c in_pcb_hdr.h
        src/sys/netinet6: in6_pcb.c
        src/sys/netipsec: ipsec.c ipsec.h

Log Message:
Check if solock of PCB is held when SP caches in the PCB are accessed

To this end, a back pointer from inpcbpolicy to inpcb_hdr is added.


To generate a diff of this commit:
cvs rdiff -u -r1.177 -r1.178 src/sys/netinet/in_pcb.c
cvs rdiff -u -r1.11 -r1.12 src/sys/netinet/in_pcb_hdr.h
cvs rdiff -u -r1.160 -r1.161 src/sys/netinet6/in6_pcb.c
cvs rdiff -u -r1.83 -r1.84 src/sys/netipsec/ipsec.c
cvs rdiff -u -r1.43 -r1.44 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.c
diff -u src/sys/netinet/in_pcb.c:1.177 src/sys/netinet/in_pcb.c:1.178
--- src/sys/netinet/in_pcb.c:1.177	Thu Apr 20 08:45:09 2017
+++ src/sys/netinet/in_pcb.c	Tue Apr 25 05:44:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.c,v 1.177 2017/04/20 08:45:09 ozaki-r Exp $	*/
+/*	$NetBSD: in_pcb.c,v 1.178 2017/04/25 05:44:11 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.177 2017/04/20 08:45:09 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.178 2017/04/25 05:44:11 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -211,6 +211,7 @@ in_pcballoc(struct socket *so, void *v)
 			pool_put(&inpcb_pool, inp);
 			return error;
 		}
+		inp->inp_sp->sp_inph = (struct inpcb_hdr *)inp;
 	}
 #endif
 	so->so_pcb = inp;

Index: src/sys/netinet/in_pcb_hdr.h
diff -u src/sys/netinet/in_pcb_hdr.h:1.11 src/sys/netinet/in_pcb_hdr.h:1.12
--- src/sys/netinet/in_pcb_hdr.h:1.11	Fri May 30 01:39:03 2014
+++ src/sys/netinet/in_pcb_hdr.h	Tue Apr 25 05:44:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb_hdr.h,v 1.11 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: in_pcb_hdr.h,v 1.12 2017/04/25 05:44:11 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 2003 WIDE Project.
@@ -84,6 +84,7 @@ struct inpcb_hdr {
 };
 
 #define	sotoinpcb_hdr(so)	((struct inpcb_hdr *)(so)->so_pcb)
+#define	inph_locked(inph)	(solocked((inph)->inph_socket))
 
 LIST_HEAD(inpcbhead, inpcb_hdr);
 

Index: src/sys/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.160 src/sys/netinet6/in6_pcb.c:1.161
--- src/sys/netinet6/in6_pcb.c:1.160	Thu Apr 20 08:45:09 2017
+++ src/sys/netinet6/in6_pcb.c	Tue Apr 25 05:44:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.c,v 1.160 2017/04/20 08:45:09 ozaki-r Exp $	*/
+/*	$NetBSD: in6_pcb.c,v 1.161 2017/04/25 05:44:11 ozaki-r Exp $	*/
 /*	$KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.160 2017/04/20 08:45:09 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.161 2017/04/25 05:44:11 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -178,6 +178,7 @@ in6_pcballoc(struct socket *so, void *v)
 			pool_put(&in6pcb_pool, in6p);
 			return error;
 		}
+		in6p->in6p_sp->sp_inph = (struct inpcb_hdr *)in6p;
 	}
 #endif /* IPSEC */
 	s = splsoftnet();

Index: src/sys/netipsec/ipsec.c
diff -u src/sys/netipsec/ipsec.c:1.83 src/sys/netipsec/ipsec.c:1.84
--- src/sys/netipsec/ipsec.c:1.83	Fri Apr 21 08:39:06 2017
+++ src/sys/netipsec/ipsec.c	Tue Apr 25 05:44:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.c,v 1.83 2017/04/21 08:39:06 ozaki-r Exp $	*/
+/*	$NetBSD: ipsec.c,v 1.84 2017/04/25 05:44:11 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.83 2017/04/21 08:39:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.84 2017/04/25 05:44:11 ozaki-r Exp $");
 
 /*
  * IPsec controller part.
@@ -214,6 +214,7 @@ ipsec_checkpcbcache(struct mbuf *m, stru
 	KASSERT(IPSEC_DIR_IS_VALID(dir));
 	KASSERT(pcbsp != NULL);
 	KASSERT(dir < sizeof(pcbsp->sp_cache)/sizeof(pcbsp->sp_cache[0]));
+	KASSERT(inph_locked(pcbsp->sp_inph));
 
 	/* SPD table change invalidate all the caches. */
 	if (ipsec_spdgen != pcbsp->sp_cache[dir].cachegen) {
@@ -270,6 +271,7 @@ ipsec_fillpcbcache(struct inpcbpolicy *p
 
 	KASSERT(IPSEC_DIR_IS_INOROUT(dir));
 	KASSERT(dir < sizeof(pcbsp->sp_cache)/sizeof(pcbsp->sp_cache[0]));
+	KASSERT(inph_locked(pcbsp->sp_inph));
 
 	if (pcbsp->sp_cache[dir].cachesp)
 		KEY_FREESP(&pcbsp->sp_cache[dir].cachesp);
@@ -313,6 +315,8 @@ ipsec_invalpcbcache(struct inpcbpolicy *
 {
 	int i;
 
+	KASSERT(inph_locked(pcbsp->sp_inph));
+
 	for (i = IPSEC_DIR_INBOUND; i <= IPSEC_DIR_OUTBOUND; i++) {
 		if (dir != IPSEC_DIR_ANY && i != dir)
 			continue;
@@ -331,6 +335,8 @@ void
 ipsec_pcbconn(struct inpcbpolicy *pcbsp)
 {
 
+	KASSERT(inph_locked(pcbsp->sp_inph));
+
 	pcbsp->sp_cacheflags |= IPSEC_PCBSP_CONNECTED;
 	ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
 }
@@ -339,6 +345,8 @@ void
 ipsec_pcbdisconn(struct inpcbpolicy *pcbsp)
 {
 
+	KASSERT(inph_locked(pcbsp->sp_inph));
+
 	pcbsp->sp_cacheflags &= ~IPSEC_PCBSP_CONNECTED;
 	ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
 }
@@ -447,6 +455,7 @@ ipsec_getpolicybysock(struct mbuf *m, u_
 	KASSERTMSG(IPSEC_DIR_IS_INOROUT(dir), "invalid direction %u", dir);
 
 	KASSERT(inph->inph_socket != NULL);
+	KASSERT(inph_locked(inph));
 
 	/* XXX FIXME inpcb/in6pcb  vs socket*/
 	af = inph->inph_af;

Index: src/sys/netipsec/ipsec.h
diff -u src/sys/netipsec/ipsec.h:1.43 src/sys/netipsec/ipsec.h:1.44
--- src/sys/netipsec/ipsec.h:1.43	Thu Apr 20 08:46:07 2017
+++ src/sys/netipsec/ipsec.h	Tue Apr 25 05:44:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.h,v 1.43 2017/04/20 08:46:07 ozaki-r Exp $	*/
+/*	$NetBSD: ipsec.h,v 1.44 2017/04/25 05:44:11 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 $	*/
 
@@ -130,6 +130,7 @@ struct inpcbpolicy {
 	} sp_cache[3];			/* XXX 3 == IPSEC_DIR_MAX */
 	int sp_cacheflags;
 #define	IPSEC_PCBSP_CONNECTED	1
+	struct inpcb_hdr *sp_inph;	/* back pointer */
 };
 
 #define	IPSEC_PCB_SKIP_IPSEC(inpp, dir)					\

Reply via email to