aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-04-26 08:38:05 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-04-26 08:43:58 +0000
commitc70d1ef15db0d994eff4a2c4d9feabdc46bff1c6 (patch)
tree666f6a2342cbd862876384c320e247d264ecdaa1
parent9f1dc86c46d69d31a819fa150ce1d91fb987a61b (diff)
downloadsrc-c70d1ef15db0d994eff4a2c4d9feabdc46bff1c6.tar.gz
src-c70d1ef15db0d994eff4a2c4d9feabdc46bff1c6.zip
sctp: improve handling of illegal packets containing INIT chunks
Stop further processing of a packet when detecting that it contains an INIT chunk, which is too small or is not the only chunk in the packet. Still allow to finish the processing of chunks before the INIT chunk. Thanks to Antoly Korniltsev and Taylor Brandstetter for reporting an issue with the userland stack, which made me aware of this issue. MFC after: 3 days
-rw-r--r--sys/netinet/sctp_input.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c
index 5b4c3152da0d..c70358f0af07 100644
--- a/sys/netinet/sctp_input.c
+++ b/sys/netinet/sctp_input.c
@@ -4611,10 +4611,7 @@ process_control_chunks:
chunk_buf);
if (ch == NULL) {
*offset = length;
- if (stcb != NULL) {
- SCTP_TCB_UNLOCK(stcb);
- }
- return (NULL);
+ return (stcb);
}
num_chunks++;
@@ -4648,12 +4645,12 @@ process_control_chunks:
/* The INIT chunk must be the only chunk. */
if ((num_chunks > 1) ||
(length - *offset > (int)SCTP_SIZE32(chk_length))) {
- /* RFC 4960 requires that no ABORT is sent */
+ /*
+ * RFC 4960bis requires stopping the
+ * processing of the packet.
+ */
*offset = length;
- if (stcb != NULL) {
- SCTP_TCB_UNLOCK(stcb);
- }
- return (NULL);
+ return (stcb);
}
/* Honor our resource limit. */
if (chk_length > SCTP_LARGEST_INIT_ACCEPTED) {