diff options
author | Michael Tuexen <tuexen@FreeBSD.org> | 2021-09-19 09:56:26 +0000 |
---|---|---|
committer | Michael Tuexen <tuexen@FreeBSD.org> | 2021-09-19 09:56:26 +0000 |
commit | e19d93b19dce276bdf178bb6a449728238d1c6f8 (patch) | |
tree | 8b1a6cd027fd34195e10a562cc796b7ef079a9b4 | |
parent | d7770a5495b19a987dddc77cabcdeadf18413b4d (diff) | |
download | src-e19d93b19dce276bdf178bb6a449728238d1c6f8.tar.gz src-e19d93b19dce276bdf178bb6a449728238d1c6f8.zip |
sctp: fix FCFS stream scheduler
Reported by: syzbot+c6793f0f0ce698bce230@syzkaller.appspotmail.com
MFC after: 1 week
-rw-r--r-- | sys/netinet/sctp_ss_functions.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/sys/netinet/sctp_ss_functions.c b/sys/netinet/sctp_ss_functions.c index 5557015cd2a9..0a5a788428bc 100644 --- a/sys/netinet/sctp_ss_functions.c +++ b/sys/netinet/sctp_ss_functions.c @@ -809,23 +809,22 @@ sctp_ss_fcfs_init(struct sctp_tcb *stcb, struct sctp_association *asoc, static void sctp_ss_fcfs_clear(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values, int holds_lock) + int clear_values SCTP_UNUSED, int holds_lock) { struct sctp_stream_queue_pending *sp; - if (clear_values) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - while (!TAILQ_EMPTY(&asoc->ss_data.out.list)) { - sp = TAILQ_FIRST(&asoc->ss_data.out.list); - TAILQ_REMOVE(&asoc->ss_data.out.list, sp, ss_next); - sp->ss_next.tqe_next = NULL; - sp->ss_next.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } + if (holds_lock == 0) { + SCTP_TCB_SEND_LOCK(stcb); + } + while (!TAILQ_EMPTY(&asoc->ss_data.out.list)) { + sp = TAILQ_FIRST(&asoc->ss_data.out.list); + TAILQ_REMOVE(&asoc->ss_data.out.list, sp, ss_next); + sp->ss_next.tqe_next = NULL; + sp->ss_next.tqe_prev = NULL; + } + asoc->ss_data.last_out_stream = NULL; + if (holds_lock == 0) { + SCTP_TCB_SEND_UNLOCK(stcb); } return; } |