net/nfc/llcp_sock.c | 4 ++++ 1 file changed, 4 insertions(+)
This patch addresses a socket state validation gap in NFC LLCP socket connection logic where connect() can be invoked on sockets in the LLCP_BOUND (or LLCP_LISTEN) state. Historical background and context: Earlier patches addressing CVE-2020-25670 / CVE-2020-25673 added an explicit check for the LLCP_CONNECTING state in llcp_sock_connect() to prevent duplicate in-flight connection requests on non-blocking sockets from linking the socket multiple times into local->connecting_sockets. However, that check implicitly assumed that any socket that was neither LLCP_CONNECTED nor LLCP_CONNECTING was in LLCP_CLOSED. It omitted the possibility that a socket had already been bound via llcp_sock_bind(), which transitions the socket to LLCP_BOUND and adds it to local->sockets. Vulnerability impact: When connect() is called on an already bound socket: 1. llcp_sock_connect() overwrites llcp_sock->dev and llcp_sock->local without dropping the original references, causing refcount and memory leaks (service_name). 2. The socket is added to local->connecting_sockets while still remaining linked in local->sockets. 3. Upon receiving connection confirmation (CC), nfc_llcp_recv_cc() unlinks the socket from connecting_sockets and links it into local->sockets. Because the head of local->sockets still pointed to the socket itself, hlist_add_head() links the node to itself (node->next = node), forming an infinite loop. Subsequent traversals of local->sockets (e.g. during lookup or release) loop indefinitely under spinlock, leading to kernel soft-lockups and RCU stalls. 4. If connect() targets a different device index, the socket becomes linked across two different NFC devices, causing cross-device socket confusion. Fix: Enforce that sockets must be in LLCP_CLOSED before initiating a connection, returning -EBADFD otherwise, aligning with the state check behavior in llcp_sock_bind() and llcp_raw_sock_bind(). Tested and confirmed style-compliant with checkpatch.pl (0 errors, 0 warnings). Yuchao Zhang (1): nfc: llcp: reject connect() on sockets not in LLCP_CLOSED state net/nfc/llcp_sock.c | 4 ++++ 1 file changed, 4 insertions(+) -- 2.53.0
© 2016 - 2026 Red Hat, Inc.