[PATCH 0/2] mtd: spi-nor: sfdp: bound two optional parameter tables
HyeongJun An <[email protected]> Sun, 19 Jul 2026 10:08:18 +0900
| Newsgroups | gmane.linux.kernel.stable,gmane.linux.drivers.mtd,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Two of the optional SFDP parameter table parsers allocate a bounce buffer from the table length the flash reports, then index it at fixed offsets without checking the table is long enough to hold them. spi_nor_parse_profile1() reads up to DWORD5, never checks the length spi_nor_parse_sccr() reads up to DWORD22, never checks the length The length is a u8 supplied by the flash, so a device that advertises either table with a shorter length makes the read run past the allocation, and a length of zero makes kmalloc() hand back ZERO_SIZE_PTR, which the parsers then dereference. spi_nor_parse_4bait() already guards its table this way with SFDP_4BAIT_DWORD_MAX, so both patches just apply the same check. spi_nor_parse_sccr_mc() is left alone: it derives its highest index from the length it allocated with, so it stays in bounds. The two parsers were added at different times, so they carry different Fixes tags and are split into one patch each. Found by code inspection; I have no xSPI or multi-die part to reproduce this on, so this is not runtime tested. HyeongJun An (2): mtd: spi-nor: sfdp: check the length of the xSPI Profile 1.0 table mtd: spi-nor: sfdp: check the length of the SCCR map drivers/mtd/spi-nor/sfdp.c | 8 ++++++++ 1 file changed, 8 insertions(+) -- 2.43.0