]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: do not fallback when OoO is present
authorPaolo Abeni <pabeni@redhat.com>
Tue, 18 Nov 2025 07:20:22 +0000 (08:20 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 20 Nov 2025 04:07:14 +0000 (20:07 -0800)
In case of DSS corruption, the MPTCP protocol tries to avoid the subflow
reset if fallback is possible. Such corruptions happen in the receive
path; to ensure fallback is possible the stack additionally needs to
check for OoO data, otherwise the fallback will break the data stream.

Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
Cc: stable@vger.kernel.org
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20251118-net-mptcp-misc-fixes-6-18-rc6-v1-4-806d3781c95f@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c

index e30e9043a69437b206457c470d3f95001bf7503c..6f0e8f670d837aef21a8c0a143e861ddca5db797 100644 (file)
@@ -76,6 +76,13 @@ bool __mptcp_try_fallback(struct mptcp_sock *msk, int fb_mib)
        if (__mptcp_check_fallback(msk))
                return true;
 
+       /* The caller possibly is not holding the msk socket lock, but
+        * in the fallback case only the current subflow is touching
+        * the OoO queue.
+        */
+       if (!RB_EMPTY_ROOT(&msk->out_of_order_queue))
+               return false;
+
        spin_lock_bh(&msk->fallback_lock);
        if (!msk->allow_infinite_fallback) {
                spin_unlock_bh(&msk->fallback_lock);