mptcp: fix data races on remote_id
Similar to the previous patch, address the data race on remote_id, adding the suitable ONCE annotations. Fixes: bedee0b56113 ("mptcp: address lookup improvements") Cc: stable@vger.kernel.org Signed-off-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a7cfe77663
commit
967d3c2712
@ -443,7 +443,7 @@ static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk,
|
|||||||
mptcp_for_each_subflow(msk, subflow) {
|
mptcp_for_each_subflow(msk, subflow) {
|
||||||
ssk = mptcp_subflow_tcp_sock(subflow);
|
ssk = mptcp_subflow_tcp_sock(subflow);
|
||||||
remote_address((struct sock_common *)ssk, &addrs[i]);
|
remote_address((struct sock_common *)ssk, &addrs[i]);
|
||||||
addrs[i].id = subflow->remote_id;
|
addrs[i].id = READ_ONCE(subflow->remote_id);
|
||||||
if (deny_id0 && !addrs[i].id)
|
if (deny_id0 && !addrs[i].id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -799,18 +799,18 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
|
|||||||
|
|
||||||
mptcp_for_each_subflow_safe(msk, subflow, tmp) {
|
mptcp_for_each_subflow_safe(msk, subflow, tmp) {
|
||||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||||
|
u8 remote_id = READ_ONCE(subflow->remote_id);
|
||||||
int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
|
int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
|
||||||
u8 id = subflow_get_local_id(subflow);
|
u8 id = subflow_get_local_id(subflow);
|
||||||
|
|
||||||
if (rm_type == MPTCP_MIB_RMADDR && subflow->remote_id != rm_id)
|
if (rm_type == MPTCP_MIB_RMADDR && remote_id != rm_id)
|
||||||
continue;
|
continue;
|
||||||
if (rm_type == MPTCP_MIB_RMSUBFLOW && !mptcp_local_id_match(msk, id, rm_id))
|
if (rm_type == MPTCP_MIB_RMSUBFLOW && !mptcp_local_id_match(msk, id, rm_id))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pr_debug(" -> %s rm_list_ids[%d]=%u local_id=%u remote_id=%u mpc_id=%u",
|
pr_debug(" -> %s rm_list_ids[%d]=%u local_id=%u remote_id=%u mpc_id=%u",
|
||||||
rm_type == MPTCP_MIB_RMADDR ? "address" : "subflow",
|
rm_type == MPTCP_MIB_RMADDR ? "address" : "subflow",
|
||||||
i, rm_id, id, subflow->remote_id,
|
i, rm_id, id, remote_id, msk->mpc_endpoint_id);
|
||||||
msk->mpc_endpoint_id);
|
|
||||||
spin_unlock_bh(&msk->pm.lock);
|
spin_unlock_bh(&msk->pm.lock);
|
||||||
mptcp_subflow_shutdown(sk, ssk, how);
|
mptcp_subflow_shutdown(sk, ssk, how);
|
||||||
|
|
||||||
|
@ -535,7 +535,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
|
|||||||
subflow->backup = mp_opt.backup;
|
subflow->backup = mp_opt.backup;
|
||||||
subflow->thmac = mp_opt.thmac;
|
subflow->thmac = mp_opt.thmac;
|
||||||
subflow->remote_nonce = mp_opt.nonce;
|
subflow->remote_nonce = mp_opt.nonce;
|
||||||
subflow->remote_id = mp_opt.join_id;
|
WRITE_ONCE(subflow->remote_id, mp_opt.join_id);
|
||||||
pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u backup=%d",
|
pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u backup=%d",
|
||||||
subflow, subflow->thmac, subflow->remote_nonce,
|
subflow, subflow->thmac, subflow->remote_nonce,
|
||||||
subflow->backup);
|
subflow->backup);
|
||||||
@ -1567,7 +1567,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
|
|||||||
pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d", msk,
|
pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d", msk,
|
||||||
remote_token, local_id, remote_id);
|
remote_token, local_id, remote_id);
|
||||||
subflow->remote_token = remote_token;
|
subflow->remote_token = remote_token;
|
||||||
subflow->remote_id = remote_id;
|
WRITE_ONCE(subflow->remote_id, remote_id);
|
||||||
subflow->request_join = 1;
|
subflow->request_join = 1;
|
||||||
subflow->request_bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
|
subflow->request_bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
|
||||||
subflow->subflow_id = msk->subflow_id++;
|
subflow->subflow_id = msk->subflow_id++;
|
||||||
@ -1974,7 +1974,7 @@ static void subflow_ulp_clone(const struct request_sock *req,
|
|||||||
new_ctx->fully_established = 1;
|
new_ctx->fully_established = 1;
|
||||||
new_ctx->remote_key_valid = 1;
|
new_ctx->remote_key_valid = 1;
|
||||||
new_ctx->backup = subflow_req->backup;
|
new_ctx->backup = subflow_req->backup;
|
||||||
new_ctx->remote_id = subflow_req->remote_id;
|
WRITE_ONCE(new_ctx->remote_id, subflow_req->remote_id);
|
||||||
new_ctx->token = subflow_req->token;
|
new_ctx->token = subflow_req->token;
|
||||||
new_ctx->thmac = subflow_req->thmac;
|
new_ctx->thmac = subflow_req->thmac;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user