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