{"id":41052,"date":"2026-10-19T00:31:56","date_gmt":"2026-10-18T16:31:56","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98580"},"modified":"2026-10-19T00:31:56","modified_gmt":"2026-10-18T16:31:56","slug":"cve-2026-98580","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98580","title":{"rendered":"CVE-2026-98580 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnfc: llcp: Fix race c"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nfc: llcp: Fix race condition in accept_queue lifecycle<\/p>\n<p>In nfc_llcp_socket_release(), sockets and listener accept queues are<br \/>\nwalked under the local sockets rwlock and bh_lock_sock().  However,<br \/>\nbh_lock_sock() does not synchronise against process-context lock_sock()<br \/>\nheld by nfc_llcp_accept_dequeue() during accept().  Because<br \/>\nsocket_release() does not check sock_owned_by_user(), both paths can<br \/>\nconcurrently unlink and release the same child socket, resulting in<br \/>\nuse-after-free or a NULL pointer dereference of child-&gt;parent in<br \/>\nnfc_llcp_accept_unlink().<\/p>\n<p>Fix this synchronisation race by having nfc_llcp_socket_release() use<br \/>\nprocess-context lock_sock() instead of bh_lock_sock():<\/p>\n<p>1. Pop sockets from the local sockets list under the write lock using<br \/>\n   nfc_llcp_sock_list_pop() so lock_sock() can be acquired without<br \/>\n   holding the rwlock.<\/p>\n<p>2. Because lock_sock() can sleep, defer the final release of the<br \/>\n   nfc_llcp_local structure to a workqueue (release_work).  This avoids<br \/>\n   a sleeping-in-atomic bug when the last local reference is dropped<br \/>\n   from softirq context.  Additionally, hold a single device reference<br \/>\n   on local from registration until final destruction.<\/p>\n<p>3. In nfc_llcp_local_get(), use kref_get_unless_zero() to prevent<br \/>\n   resurrecting a local object whose teardown has been scheduled.<\/p>\n<p>4. In llcp_sock_accept(), verify that the listener socket state is still<br \/>\n   LLCP_LISTEN after waking from schedule_timeout() to prevent hangs if<br \/>\n   the listener is closed concurrently.<\/p>\n<p>5. When unlinking unaccepted child sockets during listener release,<br \/>\n   unlink them from local-&gt;sockets, call sock_orphan(), and drop their<br \/>\n   initial sk_alloc creation reference via sock_put().<\/p>\n<p>6. Make nfc_llcp_accept_unlink() idempotent by guarding parent access with<br \/>\n   a NULL check.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nfc: llcp: Fix race condition in accept_queue lifecycle<\/p>\n<p>In nfc_llcp_socket_release(), sockets and listener accept queues are<br \/>\nwalke<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41052","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}