mptcp: fix locking for setsockopt corner-case
authorPaolo Abeni <pabeni@redhat.com>
Tue, 7 Feb 2023 13:04:14 +0000 (14:04 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Feb 2023 11:59:40 +0000 (12:59 +0100)
[ Upstream commit 21e43569685de4ad773fb060c11a15f3fd5e7ac4 ]

We need to call the __mptcp_nmpc_socket(), and later subflow socket
access under the msk socket lock, or e.g. a racing connect() could
change the socket status under the hood, with unexpected results.

Fixes: 54635bd04701 ("mptcp: add TCP_FASTOPEN_CONNECT socket option")
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/mptcp/sockopt.c

index 8d3b09d..696ba39 100644 (file)
@@ -772,14 +772,21 @@ static int mptcp_setsockopt_sol_tcp_defer(struct mptcp_sock *msk, sockptr_t optv
 static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
                                          sockptr_t optval, unsigned int optlen)
 {
+       struct sock *sk = (struct sock *)msk;
        struct socket *sock;
+       int ret = -EINVAL;
 
        /* Limit to first subflow, before the connection establishment */
+       lock_sock(sk);
        sock = __mptcp_nmpc_socket(msk);
        if (!sock)
-               return -EINVAL;
+               goto unlock;
 
-       return tcp_setsockopt(sock->sk, level, optname, optval, optlen);
+       ret = tcp_setsockopt(sock->sk, level, optname, optval, optlen);
+
+unlock:
+       release_sock(sk);
+       return ret;
 }
 
 static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,