KernelScan.io

HIGH Introduced in 6.19

nfsd DirectWrite OOB

CVE-2026-89678

CVSS 7.5 / 10.0 NVD

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N

KernelScan AI6.9MEDIUM

01

In the Linux kernel, the following vulnerability has been resolved: nfsd: fix partial-write detection in nfsd_direct_write nfsd_direct_write() walks a list of write segments and, after each vfs_iocb_iter_write(), tries to detect a short write so the loop can stop before placing the next segment at a wrong file offset: host_err = vfs_iocb_iter_write(file, kiocb, &segments[i].iter); if (host_err < 0) return host_err; *cnt += host_err; if (host_err < segments[i].iter.count) break; /* partial write */ vfs_iocb_iter_write() runs the iter through ->write_iter(), which advances the iter by the number of bytes written. By the time the check runs, segments[i].iter.count is the residual, not the original request length: before write_iter: iter.count == original_len after write_iter: iter.count == original_len - host_err The condition then reduces to host_err < original_len - host_err, so the break fires only when less than half of the segment was written. Any short write completing between 50% and 99% of the segment slips through; the loop advances to the next segment with kiocb->ki_pos only bumped by the short amount, writing the next segment's payload at the wrong offset and over-reporting *cnt to the NFS client. Snapshot the segment's byte count before the write and compare host_err against that snapshot so any short write breaks the loop.

02

Engine v0.6.0

Risk summary

An NFS client can trigger a partial-write detection flaw in the kernel NFS server's direct write path, causing subsequent write segments to be placed at incorrect file offsets. This results in silent data corruption on the server's filesystem, as the server over-reports the number of bytes written back to the NFS client.

Affectedfs/nfsd/vfs.c (nfsd)

Vulnerability analysis

The NFS server's direct-write path mishandles partial writes. After a write operation completes, the check mistakenly uses the remaining byte count instead of the original segment size. This means short writes that finish more than half of a segment go undetected, so the loop continues and writes the next segment to the wrong file position. The server also tells the client that more data was written than actually reached disk. The fix records each segment's original size beforehand and stops the loop on any short write. Any authorized NFS client that can issue write requests to the server can trigger this.

03

BranchIntroducedFixed inPatch commit
7.26.197.2.4fa6590dfd16a
mainline6.197.3-rc1250ec14932d5