]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: fix scheduling with atomic in timestamp sockopt
authorGang Yan <yangang@kylinos.cn>
Mon, 27 Apr 2026 19:54:34 +0000 (21:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 14 May 2026 13:31:17 +0000 (15:31 +0200)
commit b5c52908d52c6c8eb8933264aa6087a0600fd892 upstream.

Using lock_sock_fast() (atomic context) around sock_set_timestamp()
and sock_set_timestamping() is unsafe, as both helpers can sleep.

Replace lock_sock_fast() with sleepable lock_sock()/release_sock()
to avoid scheduling while atomic panic.

Fixes: 9061f24bf82e ("mptcp: sockopt: propagate timestamp request to subflows")
Cc: stable@vger.kernel.org
Reported-by: Sashiko <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260420093343.16443-1-gang.yan@linux.dev
Signed-off-by: Gang Yan <yangang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260427-net-mptcp-misc-fixes-7-1-rc2-v1-2-7432b7f279fa@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mptcp/sockopt.c

index 30b45d2ab38c8a4934fcff8c15c4c28d8482edae..1cf608e7357bdac0cad1cba0c8fda14fc4b1cea0 100644 (file)
@@ -159,10 +159,10 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mptcp_sock *msk, int optnam
        lock_sock(sk);
        mptcp_for_each_subflow(msk, subflow) {
                struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
-               bool slow = lock_sock_fast(ssk);
 
+               lock_sock(ssk);
                sock_set_timestamp(ssk, optname, !!val);
-               unlock_sock_fast(ssk, slow);
+               release_sock(ssk);
        }
 
        release_sock(sk);
@@ -235,10 +235,10 @@ static int mptcp_setsockopt_sol_socket_timestamping(struct mptcp_sock *msk,
 
        mptcp_for_each_subflow(msk, subflow) {
                struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
-               bool slow = lock_sock_fast(ssk);
 
+               lock_sock(ssk);
                sock_set_timestamping(ssk, optname, timestamping);
-               unlock_sock_fast(ssk, slow);
+               release_sock(ssk);
        }
 
        release_sock(sk);