Skip to content

Commit 5e20087

Browse files
Florian Westphaldavem330
authored andcommitted
mptcp: handle mptcp listener destruction via rcu
Following splat can occur during self test: BUG: KASAN: use-after-free in subflow_data_ready+0x156/0x160 Read of size 8 at addr ffff888100c35c28 by task mptcp_connect/4808 subflow_data_ready+0x156/0x160 tcp_child_process+0x6a3/0xb30 tcp_v4_rcv+0x2231/0x3730 ip_protocol_deliver_rcu+0x5c/0x860 ip_local_deliver_finish+0x220/0x360 ip_local_deliver+0x1c8/0x4e0 ip_rcv_finish+0x1da/0x2f0 ip_rcv+0xd0/0x3c0 __netif_receive_skb_one_core+0xf5/0x160 __netif_receive_skb+0x27/0x1c0 process_backlog+0x21e/0x780 net_rx_action+0x35f/0xe90 do_softirq+0x4c/0x50 [..] This occurs when accessing subflow_ctx->conn. Problem is that tcp_child_process() calls listen sockets' sk_data_ready() notification, but it doesn't hold the listener lock. Another cpu calling close() on the listener will then cause transition of refcount to 0. Fixes: 58b0991 ("mptcp: create msk early") Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bd01942 commit 5e20087

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

net/mptcp/protocol.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,6 +1378,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk, struct request_sock *req)
13781378
msk->ack_seq = ack_seq;
13791379
}
13801380

1381+
sock_reset_flag(nsk, SOCK_RCU_FREE);
13811382
/* will be fully established after successful MPC subflow creation */
13821383
inet_sk_state_store(nsk, TCP_SYN_RECV);
13831384
bh_unlock_sock(nsk);
@@ -1779,6 +1780,8 @@ static int mptcp_listen(struct socket *sock, int backlog)
17791780
goto unlock;
17801781
}
17811782

1783+
sock_set_flag(sock->sk, SOCK_RCU_FREE);
1784+
17821785
err = ssock->ops->listen(ssock, backlog);
17831786
inet_sk_state_store(sock->sk, inet_sk_state_load(ssock->sk));
17841787
if (!err)

0 commit comments

Comments
 (0)