linux/net/nfc
Lee Jones bd08bb7443 nfc: llcp: Fix use-after-free race in nfc_llcp_recv_cc()
[ Upstream commit b493ea2765 ]

A race condition exists in the NFC LLCP connection state machine where
the connection acceptance packet (CC) can be processed concurrently with
socket release.  This can lead to a use-after-free of the socket object.

When nfc_llcp_recv_cc() moves the socket from the connecting_sockets
list to the sockets list, it does so without holding the socket lock.
If llcp_sock_release() is executing concurrently, it might have already
unlinked the socket and dropped its references, which can result in
nfc_llcp_recv_cc() linking a freed socket into the live list.

Fix this by holding lock_sock() during the state transition and list
movement in nfc_llcp_recv_cc().  After acquiring the lock, check if
the socket is still hashed to ensure it hasn't already been unlinked
and marked for destruction by the release path.  This aligns the locking
pattern with recv_hdlc() and recv_disc().

Fixes: a69f32af86 ("NFC: Socket linked list")
Signed-off-by: Lee Jones <lee@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260429134115.3558604-2-lee@kernel.org
Signed-off-by: David Heidelberg <david@ixit.cz>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-06-19 13:33:22 +02:00
..
hci nfc: hci: shdlc: Stop timers and work before freeing context 2026-03-04 07:19:36 -05:00
nci nfc: nci: fix circular locking dependency in nci_close_device 2026-04-18 10:33:24 +02:00
af_nfc.c nfc: fix error handling of nfc_proto_register() 2021-10-13 17:32:38 -07:00
core.c nfc: nci: Fix race between rfkill and nci_unregister_device(). 2026-02-06 16:42:00 +01:00
digital.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 288 2019-06-05 17:36:37 +02:00
digital_core.c NFC: digital: fix possible memory leak in digital_tg_listen_mdaa() 2021-10-13 17:44:29 -07:00
digital_dep.c net:nfc:digital: Fix a double free in digital_tg_recv_dep_req 2021-04-27 15:36:10 -07:00
digital_technology.c NFC: digital: Bounds check NFC-A cascade depth in SDD response handler 2026-06-01 17:35:04 +02:00
Kconfig net: remove redundant 'depends on NET' 2021-01-27 17:04:12 -08:00
llcp.h net: nfc: Fix use-after-free caused by nfc_llcp_find_local 2023-07-23 13:46:56 +02:00
llcp_commands.c nfc: llcp: Fix memleak in nfc_llcp_send_ui_frame(). 2026-02-06 16:41:59 +01:00
llcp_core.c nfc: llcp: Fix use-after-free race in nfc_llcp_recv_cc() 2026-06-19 13:33:22 +02:00
llcp_sock.c nfc: llcp: Fix use-after-free in llcp_sock_release() 2026-06-19 13:33:22 +02:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
netlink.c net: nfc: Fix use-after-free caused by nfc_llcp_find_local 2023-07-23 13:46:56 +02:00
nfc.h net: nfc: Fix use-after-free caused by nfc_llcp_find_local 2023-07-23 13:46:56 +02:00
rawsock.c nfc: rawsock: cancel tx_work before socket teardown 2026-04-18 10:33:10 +02:00