CVE-2026-46169: hfsplus: fix uninit-value by validating catalog record size
In the Linux kernel, the following vulnerability has been resolved:
hfsplus: fix uninit-value by validating catalog record size
Syzbot reported a KMSAN uninit-value issue in hfsplusstrcasecmp(). The root cause is that hfsbrecread() doesn't validate that the on-disk record size matches the expected size for the record type being read.
When mounting a corrupted filesystem, hfsbrecread() may read less data than expected. For example, when reading a catalog thread record, the debug output showed:
HFSPLUSBRECREAD: reclen=520, fd->entrylength=26 HFSPLUSBRECREAD: WARNING - entrylength (26) < reclen (520) - PARTIAL READ!
hfsbrecread() only validates that entrylength is not greater than the buffer size, but doesn't check if it's less than expected. It successfully reads 26 bytes into a 520-byte structure and returns success, leaving 494 bytes uninitialized.
This uninitialized data in tmp.thread.nodeName then gets copied by hfspluscatbuildkeyuni() and used by hfsplusstrcasecmp(), triggering the KMSAN warning when the uninitialized bytes are used as array indices in casefold().
Fix by introducing hfsplusbrecreadcat() wrapper that: 1. Calls hfsbrecread() to read the data 2. Validates the record size based on the type field: - Fixed size for folder and file records - Variable size for thread records (depends on string length) 3. Returns -EIO if size doesn't match expected
For thread records, check against HFSPLUSMINTHREADSZ before reading nodeName.length to avoid reading uninitialized data at call sites that don't zero-initialize the entry structure.
Also initialize the tmp variable in hfsplusfindcat() as defensive programming to ensure no uninitialized data even if validation is bypassed.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Initialize the tmp variable in hfsplus_find_cat() as a defensive measure (ensure tmp is initialized before use).
Linux kernel (hfsplus) tmp initialization in hfsplus_find_cat() = initialize the tmp variable - Configuration
Introduce hfsplus_brec_read_cat() wrapper that calls hfs_brec_read() to read the data and perform additional validation before returning the record.
Linux kernel (hfsplus) use hfsplus_brec_read_cat() wrapper = hfsplus_brec_read_cat() - Configuration
For thread records, check against HFSPLUS_MIN_THREAD_SZ before reading to avoid partial reads of thread records.
Linux kernel (hfsplus) thread record minimum size check = HFSPLUS_MIN_THREAD_SZ - Configuration
Validate the record size based on the type field when reading catalog records; return -EIO if size doesn't match the expected size for the record type being read.
Linux kernel (hfsplus) catalog record size validation = return -EIO if size doesn't match expected
Event History
Frequently Asked Questions
What is the severity of CVE-2026-46169?
The severity of CVE-2026-46169 is rated at risk 27.
How do I fix CVE-2026-46169?
To fix CVE-2026-46169, update to the latest patched version of the Linux kernel that addresses this vulnerability.
What is the impact of CVE-2026-46169?
CVE-2026-46169 could lead to potential exposure to uninitialized memory values due to improper validation in the hfsplus file system.
Which software is affected by CVE-2026-46169?
The affected software is the Linux kernel specifically related to the hfsplus file system.
What is the root cause of CVE-2026-46169?
The root cause of CVE-2026-46169 is the lack of validation for the on-disk record size in the hfs_brec_read() function.