FAILED: patch "[PATCH] mptcp: handle consistently DSS corruption" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x e32d262c89e2b22cb0640223f953b548617ed8a6
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024101413-murky-haiku-4511@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
e32d262c89e2 ("mptcp: handle consistently DSS corruption") 104125b82e5c ("mptcp: add mib for infinite map sending") 1e39e5a32ad7 ("mptcp: infinite mapping sending") 0eb4e7ee1655 ("mptcp: add tracepoint in mptcp_sendmsg_frag") f284c0c77321 ("mptcp: implement fastclose xmit path") f70cad1085d1 ("mptcp: stop relying on tcp_tx_skb_cache")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e32d262c89e2b22cb0640223f953b548617ed8a6 Mon Sep 17 00:00:00 2001
From: Paolo Abeni <[email protected]>
Date: Tue, 8 Oct 2024 13:04:52 +0200
Subject: [PATCH] mptcp: handle consistently DSS corruption
Bugged peer implementation can send corrupted DSS options, consistently hitting a few warning in the data path. Use DEBUG_NET assertions, to avoid the splat on some builds and handle consistently the error, dumping related MIBs and performing fallback and/or reset according to the subflow type.
net/mptcp/mib.c +2 -0
@@ -32,6 +32,8 @@ static const struct snmp_mib mptcp_snmp_list[] = {SNMP_MIB_ITEM ("MPJoinSynTxBindErr" ,MPTCP_MIB_JOINSYNTXBINDERR ),SNMP_MIB_ITEM ("MPJoinSynTxConnectErr" ,MPTCP_MIB_JOINSYNTXCONNECTERR ),SNMP_MIB_ITEM ("DSSNotMatching" ,MPTCP_MIB_DSSNOMATCH ), +SNMP_MIB_ITEM ("DSSCorruptionFallback" ,MPTCP_MIB_DSSCORRUPTIONFALLBACK ), +SNMP_MIB_ITEM ("DSSCorruptionReset" ,MPTCP_MIB_DSSCORRUPTIONRESET ),SNMP_MIB_ITEM ("InfiniteMapTx" ,MPTCP_MIB_INFINITEMAPTX ),SNMP_MIB_ITEM ("InfiniteMapRx" ,MPTCP_MIB_INFINITEMAPRX ), SNMP_MIB_ITEM("DSSNoMatchTCP", MPTCP_MIB_DSSTCPMISMATCH),
net/mptcp/mib.h +2 -0
@@ -27,6 +27,8 @@ enum linux_mptcp_mib_field {MPTCP_MIB_JOINSYNTXBINDERR ,/* Not able to bind() the address when sending a SYN + MP_JOIN */ MPTCP_MIB_JOINSYNTXCONNECTERR ,/* Not able to connect() when sending a SYN + MP_JOIN */ MPTCP_MIB_DSSNOMATCH ,/* Received a new mapping that did not match the previous one */ +MPTCP_MIB_DSSCORRUPTIONFALLBACK ,/* DSS corruption detected, fallback */ +MPTCP_MIB_DSSCORRUPTIONRESET ,/* DSS corruption detected, MPJ subflow reset */ MPTCP_MIB_INFINITEMAPTX ,/* Sent an infinite mapping */ MPTCP_MIB_INFINITEMAPRX ,/* Received an infinite mapping */ MPTCP_MIB_DSSTCPMISMATCH, /* DSS-mapping did not map with TCP's sequence numbers */
net/mptcp/protocol.c +21 -3
@@ -620,6 +620,18 @@ static bool mptcp_check_data_fin(struct sock *sk)return ret; } +static void mptcp_dss_corruption (struct mptcp_sock *msk,struct sock *ssk) +{ +if (READ_ONCE (msk->allow_infinite_fallback)) { +MPTCP_INC_STATS (sock_net (ssk), +MPTCP_MIB_DSSCORRUPTIONFALLBACK ); +mptcp_do_fallback (ssk); + }else { +MPTCP_INC_STATS (sock_net (ssk),MPTCP_MIB_DSSCORRUPTIONRESET ); +mptcp_subflow_reset (ssk); + } +} +static bool __mptcp_move_skbs_from_subflow (struct mptcp_sock *msk,struct sock *ssk,unsigned int *bytes)
@@ -692,10 +704,16 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk, moved += len; seq += len; -if (WARN_ON_ONCE (map_remaining < len)) -break ; +if (unlikely (map_remaining < len)) { +DEBUG_NET_WARN_ON_ONCE (1 ); +mptcp_dss_corruption (msk, ssk); + } }else { -WARN_ON_ONCE (!fin); +if (unlikely (!fin)) { +DEBUG_NET_WARN_ON_ONCE (1 ); +mptcp_dss_corruption (msk, ssk); + } +sk_eat_skb (ssk, skb); done = true; }
net/mptcp/subflow.c +3 -1
@@ -975,8 +975,10 @@ static bool skb_is_fully_mapped(struct sock *ssk, struct sk_buff *skb)unsigned int skb_consumed; skb_consumed =tcp_sk (ssk)->copied_seq -TCP_SKB_CB (skb)->seq; -if (WARN_ON_ONCE (skb_consumed >= skb->len)) +if (unlikely (skb_consumed >= skb->len)) { +DEBUG_NET_WARN_ON_ONCE (1 );return true; + }return skb->len - skb_consumed <= subflow->map_data_len -mptcp_subflow_get_map_offset (subflow);