{"id":28485,"date":"2026-09-25T00:31:32","date_gmt":"2026-09-24T16:31:32","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-93221"},"modified":"2026-09-25T00:31:32","modified_gmt":"2026-09-24T16:31:32","slug":"cve-2026-93221","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-93221","title":{"rendered":"CVE-2026-93221 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: convert nfsd_ne"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nfsd: convert nfsd_net boolean flags to unsigned long flags word<\/p>\n<p>nfsd_net contains several boolean fields that are accessed from<br \/>\nconcurrent contexts without serialization.  In particular,<br \/>\nnfsd4_end_grace() guards its drain path with a plain bool:<\/p>\n<p>    if (nn-&gt;grace_ended)<br \/>\n            return;<br \/>\n    nn-&gt;grace_ended = true;<\/p>\n<p>The read and the write are independent, and nothing in struct<br \/>\nnfsd_net serializes them.  At least two contexts can reach this<br \/>\ncode with no lock held:<\/p>\n<p>    laundromat path<br \/>\n      laundry_wq kworker<br \/>\n        nfs4_laundromat()<br \/>\n          nfsd4_end_grace()<\/p>\n<p>    RECLAIM_COMPLETE path<br \/>\n      nfsd compound kthread<br \/>\n        nfsd4_reclaim_complete()<br \/>\n          inc_reclaim_complete()<br \/>\n            nfsd4_end_grace()<\/p>\n<p>Both callers can observe grace_ended == false on different CPUs,<br \/>\nboth store true, and both proceed into nfsd4_record_grace_done(),<br \/>\nwhich invokes the active client_tracking_ops-&gt;grace_done callback.<br \/>\nFor tracking ops that drain reclaim_str_hashtbl (legacy_tracking_ops<br \/>\nvia nfsd4_recdir_purge_old, and the cld v1+ ops via<br \/>\nnfsd4_cld_grace_done), grace_done calls nfs4_release_reclaim(),<br \/>\nwhich walks every bucket of reclaim_str_hashtbl with no lock and<br \/>\ncalls nfs4_remove_reclaim_record() (list_del + kfree) on each<br \/>\nentry.  Two concurrent walkers corrupt the list and double-free<br \/>\nevery nfs4_client_reclaim.  A concurrent nfsd4_find_reclaim_client()<br \/>\niterating the same bucket reads through freed memory.<\/p>\n<p>A third call site exists in nfs4_state_start_net() on the<br \/>\nskip_grace startup path, but it runs under nfsd_mutex before any<br \/>\nclient has connected and before the laundromat&#8217;s first delayed<br \/>\nwork fires, so it cannot race with the two callers above.<\/p>\n<p>Replace the scattered boolean fields in nfsd_net with a single<br \/>\nunsigned long flags word and an enum nfsd_net_flag for the bit<br \/>\npositions.  The grace_ended race is fixed by using<br \/>\ntest_and_set_bit(), which is atomic on all architectures.  The<br \/>\nremaining flags (grace_end_forced, in_grace, somebody_reclaimed,<br \/>\ntrack_reclaim_completes, nfsd_net_up, lockd_up) are converted to<br \/>\nuse test_bit\/set_bit\/clear_bit for consistency.  This avoids<br \/>\nsub-word cmpxchg issues on architectures like Hexagon that only<br \/>\nsupport word-sized atomic operations.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nfsd: convert nfsd_net boolean flags to unsigned long flags word<\/p>\n<p>nfsd_net contains several boolean fields that are accessed from<br \/>\nc<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-28485","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/28485","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=28485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=28485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=28485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}