diff options
author | hsu <hsu@FreeBSD.org> | 2003-02-12 23:55:07 +0000 |
---|---|---|
committer | hsu <hsu@FreeBSD.org> | 2003-02-12 23:55:07 +0000 |
commit | 77b0e93625ad7dc5c4db4ad10125b8162e458e8c (patch) | |
tree | ba5ca691954dd59fa34335d88fefea57b556dccb /sys/netinet/in_pcb.c | |
parent | 9e1c1a039162ae21ed3e54a5e61a3aba7d2402fb (diff) | |
download | FreeBSD-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.c | 14 |
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); } |