From nobody Thu Jan 11 12:48:05 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4T9kwj5SXyz55fWZ; Thu, 11 Jan 2024 12:48:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4T9kwj4bwnz48Kq; Thu, 11 Jan 2024 12:48:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1704977285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cU11Y6piQJHR6XxxecsXMqpD4E3Oh0xCG4qUySAZKgU=; b=BIJ3/CMtcrDKQUwl0fDFcYGuHL0gqvg80X9AdMTMb7uDH3ZQP8mjVvFKGS1cdveg5W0/HT 8zk7d8fFAbJo1GbTf5Nfak5J3K5AXgWNE6dNMcjfBA+UDtGq4VeaMCJEtx9+hZeRViL/lb aIvxJHnQb5KJ1r28E31S+j7lL/FQZwKGPvWiugev5TQuspzhfKhPNYJEUCuDGGmj6gZIS5 LIDhz9sUYayFCMtxDK+CfOYDdwkpqnUlc4U76FK6C/6hX5Dkh3bm608ghQ80ToXzdVu1Tk DWqT7uFDgNyKjRQXNItSdngRTCUlsec5rkHMp/wMvIwvgTQAu1Xcktmqvu9FXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1704977285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cU11Y6piQJHR6XxxecsXMqpD4E3Oh0xCG4qUySAZKgU=; b=XmcjoaPermjUzU00gXZEOHHXelvnH8zL7xSmFIy+TxySaei1koUrRRkxiiiENSrQ3qVy5f l+Q1iSYUtrZTpOOAzvoErEHNv8cFVB/UI9aqNIhJL0FS5VmnqOyKtHXOSZgIoRb6McPJBw ariIhYNcqVnZenbTIhzwg3frQM8AZ56fQJ53qPumQ6n4AocAYBh4XvOgvaDDzue5gTso5T DakUpf8QxISSYjA9+EnqKHaFUvGN7YDhSY4sXfU6oqfGROG6vZfnagk1WGOXoxWBbgwfuL KAEUCbSER4Anpguln/4tN2P6FF9uTsOh3kY/NJGxTvNPKKyqgwiWmO8crUHtsg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1704977285; a=rsa-sha256; cv=none; b=mzrkZrXyKl622tWZSmSPd4dGDNOD+CF8IFZ9i97IedeY9B8U/RtNIH9Z0qNS84pIvg2CrA GFMriymnT207uTuHj3PcyrFGDkBZUfO3FLr/KOlWEt1jLFS7k8dEillwik6AvShN83GtqJ D/80gcl9al5oC8TALfTwr/KKwRLIlZkJWiRY3sD6XIovX5DG0Zxs8RtUaxa9L/q2ijhDGj bFJpyF/BW5QlEyxamYf4ROSbN7GQRmkIYcybWAOL9azoMM7EJi4SUAUf8fCihbBbblmNMo mibMO+D3ukrR9AAuxxX3mxq9Bkq8/wzHbczPR/cMpGmrCyxr6b2UCmiUPN5uhw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4T9kwj3fZgzJqq; Thu, 11 Jan 2024 12:48:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 40BCm58A036180; Thu, 11 Jan 2024 12:48:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40BCm5TD036177; Thu, 11 Jan 2024 12:48:05 GMT (envelope-from git) Date: Thu, 11 Jan 2024 12:48:05 GMT Message-Id: <202401111248.40BCm5TD036177@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Michael Tuexen Subject: git: f91f135e1546 - stable/13 - sctp: improve handling of SHUTDOWN and SHUTDOWN ACK chunks List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tuexen X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: f91f135e15463f0ac094a60e2ca02f1079e64997 Auto-Submitted: auto-generated The branch stable/13 has been updated by tuexen: URL: https://cgit.FreeBSD.org/src/commit/?id=f91f135e15463f0ac094a60e2ca02f1079e64997 commit f91f135e15463f0ac094a60e2ca02f1079e64997 Author: Michael Tuexen AuthorDate: 2023-08-23 06:36:15 +0000 Commit: Michael Tuexen CommitDate: 2024-01-11 12:47:34 +0000 sctp: improve handling of SHUTDOWN and SHUTDOWN ACK chunks When handling a SHUTDOWN or SHUTDOWN ACK chunk detect if the peer is violating the protocol by not having made sure all user messages are reveived by the peer. If this situation is detected, abort the association. (cherry picked from commit d18c845f99cbd2d3c0e70b3b9b09d80c655b6fb6) --- sys/netinet/sctp_input.c | 54 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index f93b066f051f..5d2a3dd26384 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -829,6 +829,38 @@ sctp_start_net_timers(struct sctp_tcb *stcb) } } +static void +sctp_check_data_from_peer(struct sctp_tcb *stcb, int *abort_flag) +{ + char msg[SCTP_DIAG_INFO_LEN]; + struct sctp_association *asoc; + struct mbuf *op_err; + unsigned int i; + + *abort_flag = 0; + asoc = &stcb->asoc; + if (SCTP_TSN_GT(asoc->highest_tsn_inside_map, asoc->cumulative_tsn) || + SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->cumulative_tsn)) { + SCTP_SNPRINTF(msg, sizeof(msg), "Missing TSN"); + *abort_flag = 1; + } + if (!*abort_flag) { + for (i = 0; i < asoc->streamincnt; i++) { + if (!TAILQ_EMPTY(&asoc->strmin[i].inqueue) || + !TAILQ_EMPTY(&asoc->strmin[i].uno_inqueue)) { + SCTP_SNPRINTF(msg, sizeof(msg), "Missing user data"); + *abort_flag = 1; + break; + } + } + } + if (*abort_flag) { + op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INPUT + SCTP_LOC_9; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); + } +} + static void sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, struct sctp_tcb *stcb, struct sctp_nets *net, int *abort_flag) @@ -852,12 +884,10 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, if (*abort_flag) { return; } - /* - * FIXME MT: Handle the case where there are still incomplete - * received user messages or known missing user messages from the - * peer. One way to handle this is to abort the associations in this - * case. - */ + sctp_check_data_from_peer(stcb, abort_flag); + if (*abort_flag) { + return; + } if (stcb->sctp_socket) { if ((SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_RECEIVED) && (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT) && @@ -914,6 +944,8 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, struct sctp_tcb *stcb, struct sctp_nets *net) { + int abort_flag; + SCTPDBG(SCTP_DEBUG_INPUT2, "sctp_handle_shutdown_ack: handling SHUTDOWN ACK\n"); if (stcb == NULL) { @@ -934,12 +966,10 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, SCTP_TCB_UNLOCK(stcb); return; } - /* - * FIXME MT: Handle the case where there are still incomplete - * received user messages or known missing user messages from the - * peer. One way to handle this is to abort the associations in this - * case. - */ + sctp_check_data_from_peer(stcb, &abort_flag); + if (abort_flag) { + return; + } #ifdef INVARIANTS if (!TAILQ_EMPTY(&stcb->asoc.send_queue) || !TAILQ_EMPTY(&stcb->asoc.sent_queue) ||