summaryrefslogtreecommitdiffstats
path: root/sys/netinet/in_pcb.c
diff options
context:
space:
mode:
authorhsu <hsu@FreeBSD.org>2003-02-12 23:55:07 +0000
committerhsu <hsu@FreeBSD.org>2003-02-12 23:55:07 +0000
commit77b0e93625ad7dc5c4db4ad10125b8162e458e8c (patch)
treeba5ca691954dd59fa34335d88fefea57b556dccb /sys/netinet/in_pcb.c
parent9e1c1a039162ae21ed3e54a5e61a3aba7d2402fb (diff)
downloadFreeBSD-src-77b0e93625ad7dc5c4db4ad10125b8162e458e8c.zip
FreeBSD-src-77b0e93625ad7dc5c4db4ad10125b8162e458e8c.tar.gz
in_pcbnotifyall() requires an exclusive protocol lock for notify functions
which modify the connection list, namely, tcp_notify().
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r--sys/netinet/in_pcb.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 776d70f..b0a66c6 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -752,26 +752,26 @@ in_pcbnotifyall(pcbinfo, faddr, errno, notify)
int s;
s = splnet();
- INP_INFO_RLOCK(pcbinfo);
+ INP_INFO_WLOCK(pcbinfo);
head = pcbinfo->listhead;
for (inp = LIST_FIRST(head); inp != NULL; inp = ninp) {
INP_LOCK(inp);
ninp = LIST_NEXT(inp, inp_list);
#ifdef INET6
if ((inp->inp_vflag & INP_IPV4) == 0) {
- INP_UNLOCK(inp);
+ INP_UNLOCK(inp);
continue;
}
#endif
if (inp->inp_faddr.s_addr != faddr.s_addr ||
inp->inp_socket == NULL) {
- INP_UNLOCK(inp);
- continue;
+ INP_UNLOCK(inp);
+ continue;
}
- (*notify)(inp, errno);
- INP_UNLOCK(inp);
+ if ((*notify)(inp, errno))
+ INP_UNLOCK(inp);
}
- INP_INFO_RUNLOCK(pcbinfo);
+ INP_INFO_WUNLOCK(pcbinfo);
splx(s);
}
OpenPOWER on IntegriCloud