divert/divert6 might end up calling sorwakeup() w/o KERNEL_LOCK() since
pf_test() is not always executed with it. Diff below fixes that and
put two asserts where selwakup() is called in the socket layer.
ok?
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.196
diff -u -p -r1.196 uipc_socket.c
--- kern/uipc_socket.c 20 Jul 2017 09:49:45 -0000 1.196
+++ kern/uipc_socket.c 24 Jul 2017 10:33:56 -0000
@@ -1926,6 +1926,7 @@ sogetopt(struct socket *so, int level, i
void
sohasoutofband(struct socket *so)
{
+ KERNEL_ASSERT_LOCKED();
csignal(so->so_pgid, SIGURG, so->so_siguid, so->so_sigeuid);
selwakeup(&so->so_rcv.sb_sel);
}
Index: kern/uipc_socket2.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.84
diff -u -p -r1.84 uipc_socket2.c
--- kern/uipc_socket2.c 18 Jul 2017 06:12:09 -0000 1.84
+++ kern/uipc_socket2.c 24 Jul 2017 10:49:12 -0000
@@ -382,6 +382,7 @@ sbunlock(struct sockbuf *sb)
void
sowakeup(struct socket *so, struct sockbuf *sb)
{
+ KERNEL_ASSERT_LOCKED();
soassertlocked(so);
selwakeup(&sb->sb_sel);
Index: netinet/ip_divert.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_divert.c,v
retrieving revision 1.48
diff -u -p -r1.48 ip_divert.c
--- netinet/ip_divert.c 26 Jun 2017 09:32:32 -0000 1.48
+++ netinet/ip_divert.c 24 Jul 2017 10:44:39 -0000
@@ -226,8 +226,11 @@ divert_packet(struct mbuf *m, int dir, u
divstat_inc(divs_fullsock);
m_freem(m);
return (0);
- } else
+ } else {
+ KERNEL_LOCK();
sorwakeup(inp->inp_socket);
+ KERNEL_UNLOCK();
+ }
}
if (sa == NULL) {
Index: netinet6/ip6_divert.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v
retrieving revision 1.48
diff -u -p -r1.48 ip6_divert.c
--- netinet6/ip6_divert.c 26 Jun 2017 09:32:32 -0000 1.48
+++ netinet6/ip6_divert.c 24 Jul 2017 10:44:36 -0000
@@ -227,8 +227,11 @@ divert6_packet(struct mbuf *m, int dir,
div6stat_inc(div6s_fullsock);
m_freem(m);
return (0);
- } else
+ } else {
+ KERNEL_LOCK();
sorwakeup(inp->inp_socket);
+ KERNEL_UNLOCK();
+ }
}
if (sa == NULL) {