aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2019-07-15 14:52:52 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2019-07-15 14:52:52 +0000
commit25fa310a5f27a2ad56020c926a85d2e541018552 (patch)
tree83c4b1f3b64c790f52816f23e8aa6e0ff5e035e6 /sys/netinet
parent6c35c7d1b615d5f5f13aedd6271e553858af6db0 (diff)
downloadsrc-25fa310a5f27a2ad56020c926a85d2e541018552.tar.gz
src-25fa310a5f27a2ad56020c926a85d2e541018552.zip
Fix socket state handling when freeing an SCTP endpoint.
This issue was found by runing syzkaller. MFC after: 1 week
Notes
Notes: svn path=/head/; revision=349998
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_pcb.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 42bf4e544de1..3c9268bf25aa 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -4912,12 +4912,11 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
inp->sctp_flags |= SCTP_PCB_FLAGS_WAS_CONNECTED;
if (so) {
SOCKBUF_LOCK(&so->so_rcv);
- if (so->so_rcv.sb_cc == 0) {
- so->so_state &= ~(SS_ISCONNECTING |
- SS_ISDISCONNECTING |
- SS_ISCONFIRMING |
- SS_ISCONNECTED);
- }
+ so->so_state &= ~(SS_ISCONNECTING |
+ SS_ISDISCONNECTING |
+ SS_ISCONFIRMING |
+ SS_ISCONNECTED);
+ so->so_state |= SS_ISDISCONNECTED;
socantrcvmore_locked(so);
socantsendmore(so);
sctp_sowwakeup(inp, so);