PT-2026-90386 · Linux · Linux

CVE-2026-89670

·

Published

2026-09-11

·

Updated

2026-09-11

None

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
nfsd: hold rcu across localio cmpxchg retry
nfsd file objects are freed via call rcu (filecache.c:296), and nfsd file slab is created without SLAB TYPESAFE BY RCU (KMEM CACHE(nfsd file, 0) at filecache.c:789), so the slab page backing a freed nfsd file becomes freely reclaimable once the RCU grace period elapses.
The again: retry block in nfsd open local fh() loads a pointer with cmpxchg and then calls nfsd file get(new) (which is refcount inc not zero) without holding rcu read lock. The sole caller nfs open local fh() drops rcu read lock before invoking this helper, so no outer reader-side critical section covers the load.
CPU 0 (nfsd open local fh) CPU 1 (nfsd file put local)

new = cmpxchg(pnf, NULL, ...) nf = xchg(pnf, NULL) nfsd file put(nf) last ref -> call rcu() /* grace period elapses; slab page recycled / nfsd file get(new) refcount inc not zero(&new->nf ref) / operates on recycled memory */
A non-zero word at the nf ref offset of the recycled object makes the refcount bump appear to succeed, and the caller then dereferences new->nf net and new->nf file out of freed memory.
Fix by taking rcu read lock() immediately before the cmpxchg and releasing it on all three exits of the if (new) block: the goto-again retry, the lost-race cleanup path, and the install-succeeded path. nfsd file put() and nfsd net put() stay outside the RCU section so they remain free to block.
Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

CVE-2026-89670

Affected Products

Linux