[<prev] [next>] [day] [month] [year] [list]
Message-ID: <2025090552-CVE-2025-39723-0daf@gregkh>
Date: Fri, 5 Sep 2025 19:21:36 +0200
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: linux-cve-announce@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...nel.org>
Subject: CVE-2025-39723: netfs: Fix unbuffered write error handling
From: Greg Kroah-Hartman <gregkh@...nel.org>
Description
===========
In the Linux kernel, the following vulnerability has been resolved:
netfs: Fix unbuffered write error handling
If all the subrequests in an unbuffered write stream fail, the subrequest
collector doesn't update the stream->transferred value and it retains its
initial LONG_MAX value. Unfortunately, if all active streams fail, then we
take the smallest value of { LONG_MAX, LONG_MAX, ... } as the value to set
in wreq->transferred - which is then returned from ->write_iter().
LONG_MAX was chosen as the initial value so that all the streams can be
quickly assessed by taking the smallest value of all stream->transferred -
but this only works if we've set any of them.
Fix this by adding a flag to indicate whether the value in
stream->transferred is valid and checking that when we integrate the
values. stream->transferred can then be initialised to zero.
This was found by running the generic/750 xfstest against cifs with
cache=none. It splices data to the target file. Once (if) it has used up
all the available scratch space, the writes start failing with ENOSPC.
This causes ->write_iter() to fail. However, it was returning
wreq->transferred, i.e. LONG_MAX, rather than an error (because it thought
the amount transferred was non-zero) and iter_file_splice_write() would
then try to clean up that amount of pipe bufferage - leading to an oops
when it overran. The kernel log showed:
CIFS: VFS: Send error in write = -28
followed by:
BUG: kernel NULL pointer dereference, address: 0000000000000008
with:
RIP: 0010:iter_file_splice_write+0x3a4/0x520
do_splice+0x197/0x4e0
or:
RIP: 0010:pipe_buf_release (include/linux/pipe_fs_i.h:282)
iter_file_splice_write (fs/splice.c:755)
Also put a warning check into splice to announce if ->write_iter() returned
that it had written more than it was asked to.
The Linux kernel CVE team has assigned CVE-2025-39723 to this issue.
Affected and fixed versions
===========================
Issue introduced in 6.10 with commit 288ace2f57c9d06dd2e42bd80d03747d879a4068 and fixed in 6.12.44 with commit f08c80af3c9a9849cd178b4843b7c01d103506a1
Issue introduced in 6.10 with commit 288ace2f57c9d06dd2e42bd80d03747d879a4068 and fixed in 6.16.4 with commit 387164a2b97e1f5404c6d0049a7409bac7d2bc5b
Issue introduced in 6.10 with commit 288ace2f57c9d06dd2e42bd80d03747d879a4068 and fixed in 6.17-rc3 with commit a3de58b12ce074ec05b8741fa28d62ccb1070468
Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.
Unaffected versions might change over time as fixes are backported to
older supported kernel versions. The official CVE entry at
https://cve.org/CVERecord/?id=CVE-2025-39723
will be updated if fixes are backported, please check that for the most
up to date information about this issue.
Affected files
==============
The file(s) affected by this issue are:
fs/netfs/read_collect.c
fs/netfs/write_collect.c
fs/netfs/write_issue.c
fs/splice.c
include/linux/netfs.h
Mitigation
==========
The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes. Individual
changes are never tested alone, but rather are part of a larger kernel
release. Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all. If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
https://git.kernel.org/stable/c/f08c80af3c9a9849cd178b4843b7c01d103506a1
https://git.kernel.org/stable/c/387164a2b97e1f5404c6d0049a7409bac7d2bc5b
https://git.kernel.org/stable/c/a3de58b12ce074ec05b8741fa28d62ccb1070468
Powered by blists - more mailing lists