Module Name:    src
Committed By:   ozaki-r
Date:           Thu Mar  2 05:26:24 UTC 2017

Modified Files:
        src/sys/netinet6: in6_pcb.c in6_pcb.h ip6_output.c

Log Message:
Make sure im6o_memberships is protected by in6p's lock (solock)


To generate a diff of this commit:
cvs rdiff -u -r1.158 -r1.159 src/sys/netinet6/in6_pcb.c
cvs rdiff -u -r1.48 -r1.49 src/sys/netinet6/in6_pcb.h
cvs rdiff -u -r1.189 -r1.190 src/sys/netinet6/ip6_output.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/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.158 src/sys/netinet6/in6_pcb.c:1.159
--- src/sys/netinet6/in6_pcb.c:1.158	Thu Mar  2 01:05:02 2017
+++ src/sys/netinet6/in6_pcb.c	Thu Mar  2 05:26:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.c,v 1.158 2017/03/02 01:05:02 ozaki-r Exp $	*/
+/*	$NetBSD: in6_pcb.c,v 1.159 2017/03/02 05:26:24 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.158 2017/03/02 01:05:02 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.159 2017/03/02 05:26:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -844,9 +844,15 @@ in6_pcbpurgeif0(struct inpcbtable *table
 
 	TAILQ_FOREACH_SAFE(inph, &table->inpt_queue, inph_queue, ninph) {
 		struct in6pcb *in6p = (struct in6pcb *)inph;
+		bool need_unlock = false;
 		if (in6p->in6p_af != AF_INET6)
 			continue;
 
+		/* The caller holds either one of in6ps' lock */
+		if (!in6p_locked(in6p)) {
+			in6p_lock(in6p);
+			need_unlock = true;
+		}
 		im6o = in6p->in6p_moptions;
 		if (im6o) {
 			/*
@@ -871,6 +877,8 @@ in6_pcbpurgeif0(struct inpcbtable *table
 			}
 		}
 		in_purgeifmcast(in6p->in6p_v4moptions, ifp);
+		if (need_unlock)
+			in6p_unlock(in6p);
 	}
 }
 

Index: src/sys/netinet6/in6_pcb.h
diff -u src/sys/netinet6/in6_pcb.h:1.48 src/sys/netinet6/in6_pcb.h:1.49
--- src/sys/netinet6/in6_pcb.h:1.48	Wed Feb 22 07:05:04 2017
+++ src/sys/netinet6/in6_pcb.h	Thu Mar  2 05:26:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.h,v 1.48 2017/02/22 07:05:04 ozaki-r Exp $	*/
+/*	$NetBSD: in6_pcb.h,v 1.49 2017/03/02 05:26:24 ozaki-r Exp $	*/
 /*	$KAME: in6_pcb.h,v 1.45 2001/02/09 05:59:46 itojun Exp $	*/
 
 /*
@@ -107,7 +107,9 @@ struct	in6pcb {
 #define in6p_faddr	in6p_ip6.ip6_dst
 #define in6p_laddr	in6p_ip6.ip6_src
 
-#define	in6plocked(in6p)	solocked((in6p)->in6p_socket)
+#define	in6p_lock(in6p)		solock((in6p)->in6p_socket)
+#define	in6p_unlock(in6p)	sounlock((in6p)->in6p_socket)
+#define	in6p_locked(in6p)	solocked((in6p)->in6p_socket)
 
 /* states in inp_state: */
 #define	IN6P_ATTACHED		INP_ATTACHED

Index: src/sys/netinet6/ip6_output.c
diff -u src/sys/netinet6/ip6_output.c:1.189 src/sys/netinet6/ip6_output.c:1.190
--- src/sys/netinet6/ip6_output.c:1.189	Thu Mar  2 05:24:23 2017
+++ src/sys/netinet6/ip6_output.c	Thu Mar  2 05:26:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_output.c,v 1.189 2017/03/02 05:24:23 ozaki-r Exp $	*/
+/*	$NetBSD: ip6_output.c,v 1.190 2017/03/02 05:26:24 ozaki-r Exp $	*/
 /*	$KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.189 2017/03/02 05:24:23 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.190 2017/03/02 05:26:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2471,7 +2471,7 @@ ip6_setmoptions(const struct sockopt *so
 	struct ip6_moptions *im6o = in6p->in6p_moptions;
 	struct in6_multi_mship *imm;
 
-	KASSERT(in6plocked(in6p));
+	KASSERT(in6p_locked(in6p));
 
 	if (im6o == NULL) {
 		/*
@@ -2772,6 +2772,7 @@ ip6_freemoptions(struct ip6_moptions *im
 	if (im6o == NULL)
 		return;
 
+	/* The owner of im6o (in6p) should be protected by solock */
 	LIST_FOREACH_SAFE(imm, &im6o->im6o_memberships, i6mm_chain, nimm) {
 		LIST_REMOVE(imm, i6mm_chain);
 		in6_leavegroup(imm);

Reply via email to