Skip to content

Commit

Permalink
mptcp: fix race in incoming ADD_ADDR option processing
Browse files Browse the repository at this point in the history
commit 837cf45 upstream.

If an MPTCP endpoint received multiple consecutive incoming
ADD_ADDR options, mptcp_pm_add_addr_received() can overwrite
the current remote address value after the PM lock is released
in mptcp_pm_nl_add_addr_received() and before such address
is echoed.

Fix the issue caching the remote address value a little earlier
and always using the cached value after releasing the PM lock.

Fixes: f7efc77 ("mptcp: drop argument port from mptcp_pm_announce_addr")
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Paolo Abeni authored and gregkh committed Mar 2, 2022
1 parent 40bbab9 commit 150d1e0
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions net/mptcp/pm_netlink.c
Expand Up @@ -606,6 +606,7 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
unsigned int add_addr_accept_max;
struct mptcp_addr_info remote;
unsigned int subflows_max;
bool reset_port = false;
int i, nr;

add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk);
Expand All @@ -615,15 +616,19 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
msk->pm.add_addr_accepted, add_addr_accept_max,
msk->pm.remote.family);

if (lookup_subflow_by_daddr(&msk->conn_list, &msk->pm.remote))
remote = msk->pm.remote;
if (lookup_subflow_by_daddr(&msk->conn_list, &remote))
goto add_addr_echo;

/* pick id 0 port, if none is provided the remote address */
if (!remote.port) {
reset_port = true;
remote.port = sk->sk_dport;
}

/* connect to the specified remote address, using whatever
* local address the routing configuration will pick.
*/
remote = msk->pm.remote;
if (!remote.port)
remote.port = sk->sk_dport;
nr = fill_local_addresses_vec(msk, addrs);

msk->pm.add_addr_accepted++;
Expand All @@ -636,8 +641,12 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
__mptcp_subflow_connect(sk, &addrs[i], &remote);
spin_lock_bh(&msk->pm.lock);

/* be sure to echo exactly the received address */
if (reset_port)
remote.port = 0;

add_addr_echo:
mptcp_pm_announce_addr(msk, &msk->pm.remote, true);
mptcp_pm_announce_addr(msk, &remote, true);
mptcp_pm_nl_addr_send_ack(msk);
}

Expand Down

0 comments on commit 150d1e0

Please sign in to comment.