linux/fs/exfat
Bryam Vargas 3a1230e7b0 exfat: bound uniname advance in exfat_find_dir_entry()
In exfat_find_dir_entry(), each TYPE_EXTEND (file name) entry advances the
output pointer by a fixed amount while the loop guard only tracks the
accumulated name length:

	if (++order == 2)
		uniname = p_uniname->name;
	else
		uniname += EXFAT_FILE_NAME_LEN;
	len = exfat_extract_uni_name(ep, entry_uniname);
	name_len += len;
	unichar = *(uniname+len);
	*(uniname+len) = 0x0;

uniname grows by EXFAT_FILE_NAME_LEN (15) per name entry, but name_len
grows only by the actual extracted length, which is shorter when a name
fragment contains an early NUL.  The only guard is
`name_len >= MAX_NAME_LENGTH`, so a crafted directory with many short
name fragments lets uniname run far past the
p_uniname->name[MAX_NAME_LENGTH + 3] buffer while name_len stays small,
causing an out-of-bounds read and write at *(uniname+len).

The sibling extractor exfat_get_uniname_from_ext_entry() already stops
on a short fragment (the lockstep `len != EXFAT_FILE_NAME_LEN` guard
added in commit d42334578e ("exfat: check if filename entries exceeds
max filename length")); exfat_find_dir_entry() never got the
equivalent.  Track the per-entry write offset as a count and reject a
fragment once the offset, or the offset plus the extracted length, would
exceed MAX_NAME_LENGTH, before forming the output pointer.

Fixes: ca06197382 ("exfat: add directory operations")
Cc: stable@vger.kernel.org
Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
2026-06-15 20:01:04 +09:00
..
balloc.c exfat: replace unsafe macros with static inline functions 2026-06-15 19:55:29 +09:00
cache.c exfat: support multi-cluster for exfat_get_cluster 2026-02-12 21:21:51 +09:00
dir.c exfat: bound uniname advance in exfat_find_dir_entry() 2026-06-15 20:01:04 +09:00
exfat_fs.h exfat: preserve benign secondary entries during rename and move 2026-06-15 20:00:53 +09:00
exfat_raw.h exfat: fix s_maxbytes 2026-03-31 23:01:07 +09:00
fatent.c exfat: add support for multi-cluster allocation 2026-06-15 19:55:42 +09:00
file.c exfat: serialize truncate against in-flight DIO 2026-06-15 20:00:49 +09:00
inode.c exfat: add swap_activate support 2026-06-15 20:01:00 +09:00
iomap.c exfat: add swap_activate support 2026-06-15 20:01:00 +09:00
iomap.h exfat: add swap_activate support 2026-06-15 20:01:00 +09:00
Kconfig exfat: add iomap direct I/O support 2026-06-15 20:00:40 +09:00
Makefile exfat: add iomap buffered I/O support 2026-06-15 20:00:23 +09:00
misc.c exfat: fix error handling for FAT table operations 2026-03-05 21:09:35 +09:00
namei.c exfat: preserve benign secondary entries during rename and move 2026-06-15 20:00:53 +09:00
nls.c exfat: fix handling of damaged volume in exfat_create_upcase_table() 2026-06-15 19:55:17 +09:00
super.c exfat: add data_start_bytes and exfat_cluster_to_phys_bytes() helper 2026-06-15 19:55:47 +09:00