mptcp: don't return sockets in foreign netns
[ Upstream commit ea1300b9df7c8e8b65695a08b8f6aaf4b25fec9c ]
mptcp_token_get_sock() may return a mptcp socket that is in
a different net namespace than the socket that received the token value.
The mptcp syncookie code path had an explicit check for this,
this moves the test into mptcp_token_get_sock() function.
Eventually token.c should be converted to pernet storage, but
such change is not suitable for net tree.
Fixes: 2c5ebd001d
("mptcp: refactor token container")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
9c6591ae8e
commit
560271d09f
@@ -232,6 +232,7 @@ found:
|
||||
|
||||
/**
|
||||
* mptcp_token_get_sock - retrieve mptcp connection sock using its token
|
||||
* @net: restrict to this namespace
|
||||
* @token: token of the mptcp connection to retrieve
|
||||
*
|
||||
* This function returns the mptcp connection structure with the given token.
|
||||
@@ -239,7 +240,7 @@ found:
|
||||
*
|
||||
* returns NULL if no connection with the given token value exists.
|
||||
*/
|
||||
struct mptcp_sock *mptcp_token_get_sock(u32 token)
|
||||
struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token)
|
||||
{
|
||||
struct hlist_nulls_node *pos;
|
||||
struct token_bucket *bucket;
|
||||
@@ -252,11 +253,15 @@ struct mptcp_sock *mptcp_token_get_sock(u32 token)
|
||||
again:
|
||||
sk_nulls_for_each_rcu(sk, pos, &bucket->msk_chain) {
|
||||
msk = mptcp_sk(sk);
|
||||
if (READ_ONCE(msk->token) != token)
|
||||
if (READ_ONCE(msk->token) != token ||
|
||||
!net_eq(sock_net(sk), net))
|
||||
continue;
|
||||
|
||||
if (!refcount_inc_not_zero(&sk->sk_refcnt))
|
||||
goto not_found;
|
||||
if (READ_ONCE(msk->token) != token) {
|
||||
|
||||
if (READ_ONCE(msk->token) != token ||
|
||||
!net_eq(sock_net(sk), net)) {
|
||||
sock_put(sk);
|
||||
goto again;
|
||||
}
|
||||
|
Reference in New Issue
Block a user