mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
mptcp: fix locking for setsockopt corner-case
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: 54635bd047 ("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>
This commit is contained in:
committed by
David S. Miller
parent
d4e85922e3
commit
21e4356968
@@ -760,14 +760,21 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
|
|||||||
static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
|
static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
|
||||||
sockptr_t optval, unsigned int optlen)
|
sockptr_t optval, unsigned int optlen)
|
||||||
{
|
{
|
||||||
|
struct sock *sk = (struct sock *)msk;
|
||||||
struct socket *sock;
|
struct socket *sock;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
/* Limit to first subflow, before the connection establishment */
|
/* Limit to first subflow, before the connection establishment */
|
||||||
|
lock_sock(sk);
|
||||||
sock = __mptcp_nmpc_socket(msk);
|
sock = __mptcp_nmpc_socket(msk);
|
||||||
if (!sock)
|
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,
|
static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
|
||||||
|
|||||||
Reference in New Issue
Block a user