* [PATCH] xfs: fix out of bounds memory read error in symlink repair
@ 2025-11-12 16:35 Darrick J. Wong
2025-11-12 16:38 ` Christoph Hellwig
2025-11-22 10:09 ` Carlos Maiolino
0 siblings, 2 replies; 3+ messages in thread
From: Darrick J. Wong @ 2025-11-12 16:35 UTC (permalink / raw)
To: Carlos Maiolino; +Cc: Christoph Hellwig, linux-xfs
From: Darrick J. Wong <djwong@kernel.org>
xfs/286 produced this report on my test fleet:
==================================================================
BUG: KFENCE: out-of-bounds read in memcpy_orig+0x54/0x110
Out-of-bounds read at 0xffff88843fe9e038 (184B right of kfence-#184):
memcpy_orig+0x54/0x110
xrep_symlink_salvage_inline+0xb3/0xf0 [xfs]
xrep_symlink_salvage+0x100/0x110 [xfs]
xrep_symlink+0x2e/0x80 [xfs]
xrep_attempt+0x61/0x1f0 [xfs]
xfs_scrub_metadata+0x34f/0x5c0 [xfs]
xfs_ioc_scrubv_metadata+0x387/0x560 [xfs]
xfs_file_ioctl+0xe23/0x10e0 [xfs]
__x64_sys_ioctl+0x76/0xc0
do_syscall_64+0x4e/0x1e0
entry_SYSCALL_64_after_hwframe+0x4b/0x53
kfence-#184: 0xffff88843fe9df80-0xffff88843fe9dfea, size=107, cache=kmalloc-128
allocated by task 3470 on cpu 1 at 263329.131592s (192823.508886s ago):
xfs_init_local_fork+0x79/0xe0 [xfs]
xfs_iformat_local+0xa4/0x170 [xfs]
xfs_iformat_data_fork+0x148/0x180 [xfs]
xfs_inode_from_disk+0x2cd/0x480 [xfs]
xfs_iget+0x450/0xd60 [xfs]
xfs_bulkstat_one_int+0x6b/0x510 [xfs]
xfs_bulkstat_iwalk+0x1e/0x30 [xfs]
xfs_iwalk_ag_recs+0xdf/0x150 [xfs]
xfs_iwalk_run_callbacks+0xb9/0x190 [xfs]
xfs_iwalk_ag+0x1dc/0x2f0 [xfs]
xfs_iwalk_args.constprop.0+0x6a/0x120 [xfs]
xfs_iwalk+0xa4/0xd0 [xfs]
xfs_bulkstat+0xfa/0x170 [xfs]
xfs_ioc_fsbulkstat.isra.0+0x13a/0x230 [xfs]
xfs_file_ioctl+0xbf2/0x10e0 [xfs]
__x64_sys_ioctl+0x76/0xc0
do_syscall_64+0x4e/0x1e0
entry_SYSCALL_64_after_hwframe+0x4b/0x53
CPU: 1 UID: 0 PID: 1300113 Comm: xfs_scrub Not tainted 6.18.0-rc4-djwx #rc4 PREEMPT(lazy) 3d744dd94e92690f00a04398d2bd8631dcef1954
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.0-4.module+el8.8.0+21164+ed375313 04/01/2014
==================================================================
On further analysis, I realized that the second parameter to min() is
not correct. xfs_ifork::if_bytes is the size of the xfs_ifork::if_data
buffer. if_bytes can be smaller than the data fork size because:
(a) the forkoff code tries to keep the data area as large as possible
(b) for symbolic links, if_bytes is the ondisk file size + 1
(c) forkoff is always a multiple of 8.
Case in point: for a single-byte symlink target, forkoff will be
8 but the buffer will only be 2 bytes long.
In other words, the logic here is wrong and we walk off the end of the
incore buffer. Fix that.
Cc: <stable@vger.kernel.org> # v6.10
Fixes: 2651923d8d8db0 ("xfs: online repair of symbolic links")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
fs/xfs/scrub/symlink_repair.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/xfs/scrub/symlink_repair.c b/fs/xfs/scrub/symlink_repair.c
index 5902398185a898..df629892462fe1 100644
--- a/fs/xfs/scrub/symlink_repair.c
+++ b/fs/xfs/scrub/symlink_repair.c
@@ -184,7 +184,7 @@ xrep_symlink_salvage_inline(
sc->ip->i_disk_size == 1 && old_target[0] == '?')
return 0;
- nr = min(XFS_SYMLINK_MAXLEN, xfs_inode_data_fork_size(ip));
+ nr = min(XFS_SYMLINK_MAXLEN, ifp->if_bytes);
memcpy(target_buf, ifp->if_data, nr);
return nr;
}
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] xfs: fix out of bounds memory read error in symlink repair
2025-11-12 16:35 [PATCH] xfs: fix out of bounds memory read error in symlink repair Darrick J. Wong
@ 2025-11-12 16:38 ` Christoph Hellwig
2025-11-22 10:09 ` Carlos Maiolino
1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2025-11-12 16:38 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Carlos Maiolino, Christoph Hellwig, linux-xfs
On Wed, Nov 12, 2025 at 08:35:18AM -0800, Darrick J. Wong wrote:
> On further analysis, I realized that the second parameter to min() is
> not correct. xfs_ifork::if_bytes is the size of the xfs_ifork::if_data
> buffer. if_bytes can be smaller than the data fork size because:
>
> (a) the forkoff code tries to keep the data area as large as possible
> (b) for symbolic links, if_bytes is the ondisk file size + 1
> (c) forkoff is always a multiple of 8.
>
> Case in point: for a single-byte symlink target, forkoff will be
> 8 but the buffer will only be 2 bytes long.
>
> In other words, the logic here is wrong and we walk off the end of the
> incore buffer. Fix that.
Yeah. Probably only saved by kmalloc usually aligning sizes up.
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] xfs: fix out of bounds memory read error in symlink repair
2025-11-12 16:35 [PATCH] xfs: fix out of bounds memory read error in symlink repair Darrick J. Wong
2025-11-12 16:38 ` Christoph Hellwig
@ 2025-11-22 10:09 ` Carlos Maiolino
1 sibling, 0 replies; 3+ messages in thread
From: Carlos Maiolino @ 2025-11-22 10:09 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Christoph Hellwig, linux-xfs
On Wed, 12 Nov 2025 08:35:18 -0800, Darrick J. Wong wrote:
> xfs/286 produced this report on my test fleet:
>
> ==================================================================
> BUG: KFENCE: out-of-bounds read in memcpy_orig+0x54/0x110
>
> Out-of-bounds read at 0xffff88843fe9e038 (184B right of kfence-#184):
> memcpy_orig+0x54/0x110
> xrep_symlink_salvage_inline+0xb3/0xf0 [xfs]
> xrep_symlink_salvage+0x100/0x110 [xfs]
> xrep_symlink+0x2e/0x80 [xfs]
> xrep_attempt+0x61/0x1f0 [xfs]
> xfs_scrub_metadata+0x34f/0x5c0 [xfs]
> xfs_ioc_scrubv_metadata+0x387/0x560 [xfs]
> xfs_file_ioctl+0xe23/0x10e0 [xfs]
> __x64_sys_ioctl+0x76/0xc0
> do_syscall_64+0x4e/0x1e0
> entry_SYSCALL_64_after_hwframe+0x4b/0x53
>
> [...]
Applied to for-next, thanks!
[1/1] xfs: fix out of bounds memory read error in symlink repair
commit: 678e1cc2f482e0985a0613ab4a5bf89c497e5acc
Best regards,
--
Carlos Maiolino <cem@kernel.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-11-22 10:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-12 16:35 [PATCH] xfs: fix out of bounds memory read error in symlink repair Darrick J. Wong
2025-11-12 16:38 ` Christoph Hellwig
2025-11-22 10:09 ` Carlos Maiolino
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox