From: Florian Westphal Date: Tue, 14 Dec 2021 23:16:02 +0000 (-0800) Subject: mptcp: clear 'kern' flag from fallback sockets X-Git-Tag: accepted/tizen/unified/20230118.172025~4143 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c26ac0ea3a91c210cf90452e625dc441adf3e549;p=platform%2Fkernel%2Flinux-rpi.git mptcp: clear 'kern' flag from fallback sockets [ Upstream commit d6692b3b97bdc165d150f4c1505751a323a80717 ] The mptcp ULP extension relies on sk->sk_sock_kern being set correctly: It prevents setsockopt(fd, IPPROTO_TCP, TCP_ULP, "mptcp", 6); from working for plain tcp sockets (any userspace-exposed socket). But in case of fallback, accept() can return a plain tcp sk. In such case, sk is still tagged as 'kernel' and setsockopt will work. This will crash the kernel, The subflow extension has a NULL ctx->conn mptcp socket: BUG: KASAN: null-ptr-deref in subflow_data_ready+0x181/0x2b0 Call Trace: tcp_data_ready+0xf8/0x370 [..] Fixes: cf7da0d66cc1 ("mptcp: Create SUBFLOW socket for incoming connections") Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 421fa62..fdff811 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2901,7 +2901,7 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err, */ if (WARN_ON_ONCE(!new_mptcp_sock)) { tcp_sk(newsk)->is_mptcp = 0; - return newsk; + goto out; } /* acquire the 2nd reference for the owning socket */ @@ -2913,6 +2913,8 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err, MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK); } +out: + newsk->sk_kern_sock = kern; return newsk; }