FAILED: patch "[PATCH] cifs: fix loff_t underflow in cifs_remap_file_range() when" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 6c322f5cf7476ded7a9a20f7be72462065a03c68
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090322-serotonin-marsupial-e485@gregkh' --subject-prefix 'PATCH 5.15.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6c322f5cf7476ded7a9a20f7be72462065a03c68 Mon Sep 17 00:00:00 2001
From: Frank Sorenson <[email protected]>
Date: Sat, 22 Aug 2026 16:55:17 -0500
Subject: [PATCH] cifs: fix loff_t underflow in cifs_remap_file_range() when
len == 0
With len == 0 (clone to EOF), the effective length is computed as:
len = src_inode->i_size - off;
If off > i_size, this is a negative loff_t, corrupting the ByteCount in the FSCTL_DUPLICATE_EXTENTS_TO_FILE request and inverting the range in filemap_write_and_wait_range(). The existing off >= i_size check fires only after the ioctl has already been sent.
Snapshot i_size_read() once for both the bounds check and the length calculation, eliminating the TOCTOU and 32-bit torn-read risk. Reject off > src_size with -EINVAL. Treat off == src_size as a no-op, consistent with __generic_remap_file_range_prep().
fs/smb/client/cifsfs.c +13 -2
@@ -1413,8 +1413,19 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,*/ lock_two_nondirectories (target_inode, src_inode); -if (len ==0 ) - len = src_inode->i_size - off; +if (len ==0 ) { +loff_t src_size =i_size_read (src_inode); + +if (off > src_size) { + rc = -EINVAL ; + goto unlock; + } + len = src_size - off; +if (!len) { + rc =0 ; + goto unlock; + } + }cifs_dbg (FYI ,"clone range\n" );
Sasha Levin
maintainerPATCH 1/1 cifs: fix loff_t underflow in cifs_remap_file_range() when len == 0
From: Frank Sorenson <[email protected]>
[ Upstream commit 6c322f5cf7476ded7a9a20f7be72462065a03c68 ]
With len == 0 (clone to EOF), the effective length is computed as:
len = src_inode->i_size - off;
If off > i_size, this is a negative loff_t, corrupting the ByteCount in the FSCTL_DUPLICATE_EXTENTS_TO_FILE request and inverting the range in filemap_write_and_wait_range(). The existing off >= i_size check fires only after the ioctl has already been sent.
Snapshot i_size_read() once for both the bounds check and the length calculation, eliminating the TOCTOU and 32-bit torn-read risk. Reject off > src_size with -EINVAL. Treat off == src_size as a no-op, consistent with __generic_remap_file_range_prep().
--- fs/cifs/cifsfs.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
fs/cifs/cifsfs.c +14 -2
@@ -1171,8 +1171,19 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,*/ lock_two_nondirectories (target_inode, src_inode); -if (len ==0 ) - len = src_inode->i_size - off; +if (len ==0 ) { +loff_t src_size =i_size_read (src_inode); + +if (off > src_size) { + rc = -EINVAL ; + goto unlock; + } + len = src_size - off; +if (!len) { + rc =0 ; + goto unlock; + } + }cifs_dbg (FYI ,"about to flush pages\n" );/* should we flush first and last page first */
@@ -1188,6 +1199,7 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,/* force revalidate of size and timestamps of target file now that target is updated on the server */ CIFS_I (target_inode)->time =0 ; +unlock:/* although unlocking in the reverse order from locking is not strictly necessary here it is a little cleaner to be consistent */ unlock_two_nondirectories (src_inode, target_inode);
Signature · 1 line
2.53.0