Commit 2b5dd463 authored by Junxi Qian's avatar Junxi Qian Committed by Jakub Kicinski
Browse files

nfc: llcp: add missing return after LLCP_CLOSED checks



In nfc_llcp_recv_hdlc() and nfc_llcp_recv_disc(), when the socket
state is LLCP_CLOSED, the code correctly calls release_sock() and
nfc_llcp_sock_put() but fails to return. Execution falls through to
the remainder of the function, which calls release_sock() and
nfc_llcp_sock_put() again. This results in a double release_sock()
and a refcount underflow via double nfc_llcp_sock_put(), leading to
a use-after-free.

Add the missing return statements after the LLCP_CLOSED branches
in both functions to prevent the fall-through.

Fixes: d646960f ("NFC: Initial LLCP support")
Signed-off-by: default avatarJunxi Qian <qjx1298677004@gmail.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260408081006.3723-1-qjx1298677004@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f462dca0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1091,6 +1091,7 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
	if (sk->sk_state == LLCP_CLOSED) {
		release_sock(sk);
		nfc_llcp_sock_put(llcp_sock);
		return;
	}

	/* Pass the payload upstream */
@@ -1182,6 +1183,7 @@ static void nfc_llcp_recv_disc(struct nfc_llcp_local *local,
	if (sk->sk_state == LLCP_CLOSED) {
		release_sock(sk);
		nfc_llcp_sock_put(llcp_sock);
		return;
	}

	if (sk->sk_state == LLCP_CONNECTED) {