CVE-2026-90096: fuse: invalidate the correct range after O_APPEND direct write
In the Linux kernel, the following vulnerability has been resolved:
fuse: invalidate the correct range after OAPPEND direct write
fusedirectwriteiter() captures pos before genericwritechecks(), which moves kipos to EOF for OAPPEND writes:
fusedirectwriteiter() { pos = iocb->kipos; / 0 (user-supplied) / genericwritechecks(); / kipos -> EOF / fusedirectio(); / writes at EOF, correct / invalidate(pos, pos + res); / [0, res) -- wrong / }
The post-write invalidation targets a stale range instead of the actual written range at EOF.
This can cause data inconsistency when the file size is not page-aligned. The tail page straddling EOF has a valid portion before EOF that concurrent readers can fault back in during the DIO write window:
Tail page (file size X not page-aligned):
pagestart X (EOF) pageend |--- valid data ----|-- stale --|
CPU0 (OAPPEND DIO writer) CPU1 (buffered reader) -------------------------- ---------------------- invalidate [X, X+len) tail page evicted FUSEWRITE in flight ... read [pagestart, X) tail page re-faulted [X, pageend) = stale FUSEWRITE completes isize = X + len invalidate [0, len) <- WRONG tail page still cached read [X, X+len) hits stale tail page returns old data
Fix by reading pos back from iocb->kipos after genericwritechecks(), as genericfiledirectwrite() does.
Also fix a typo in the comment ("may have" -> "may have competed").
Event History
Frequently Asked Questions
Under what conditions can this cause inconsistent reads?
The issue requires a FUSE direct-I/O append write and a file whose current size is not page-aligned. A concurrent buffered reader must fault the tail page back into cache while the FUSE write is in flight, allowing stale data in the newly appended range to remain cached.
What is the practical impact of a successful race?
Readers can observe stale cached contents rather than the data written by the append operation. The problem is a data-consistency issue caused by invalidating the user-supplied pre-append offset instead of the actual EOF write range.
Are ordinary non-append writes affected?
The described condition is specific to O_APPEND direct writes, where generic write checks move the write position to EOF. The provided information does not indicate that non-append writes are affected.