Skip to content

Commit f0f0cfd

Browse files
Louis Rannouambarus
authored andcommitted
mtd: spi-nor: Fix shift-out-of-bounds in spi_nor_set_erase_type
spi_nor_set_erase_type() was used either to set or to mask out an erase type. When we used it to mask out an erase type a shift-out-of-bounds was hit: UBSAN: shift-out-of-bounds in drivers/mtd/spi-nor/core.c:2237:24 shift exponent 4294967295 is too large for 32-bit type 'int' The setting of the size_{shift, mask} and of the opcode are unnecessary when the erase size is zero, as throughout the code just the erase size is considered to determine whether an erase type is supported or not. Setting the opcode to 0xFF was wrong too as nobody guarantees that 0xFF is an unused opcode. Thus when masking out an erase type, just set the erase size to zero. This will fix the shift-out-of-bounds. Fixes: 5390a8d ("mtd: spi-nor: add support to non-uniform SFDP SPI NOR flash memories") Cc: [email protected] Reported-by: Alexander Stein <[email protected]> Signed-off-by: Louis Rannou <[email protected]> Tested-by: Alexander Stein <[email protected]> Link: https://lore.kernel.org/r/[email protected] [ta: refine changes, new commit message, fix compilation error] Signed-off-by: Tudor Ambarus <[email protected]>
1 parent 5927318 commit f0f0cfd

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

drivers/mtd/spi-nor/core.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,6 +2026,15 @@ void spi_nor_set_erase_type(struct spi_nor_erase_type *erase, u32 size,
20262026
erase->size_mask = (1 << erase->size_shift) - 1;
20272027
}
20282028

2029+
/**
2030+
* spi_nor_mask_erase_type() - mask out a SPI NOR erase type
2031+
* @erase: pointer to a structure that describes a SPI NOR erase type
2032+
*/
2033+
void spi_nor_mask_erase_type(struct spi_nor_erase_type *erase)
2034+
{
2035+
erase->size = 0;
2036+
}
2037+
20292038
/**
20302039
* spi_nor_init_uniform_erase_map() - Initialize uniform erase map
20312040
* @map: the erase map of the SPI NOR

drivers/mtd/spi-nor/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,7 @@ void spi_nor_set_pp_settings(struct spi_nor_pp_command *pp, u8 opcode,
681681

682682
void spi_nor_set_erase_type(struct spi_nor_erase_type *erase, u32 size,
683683
u8 opcode);
684+
void spi_nor_mask_erase_type(struct spi_nor_erase_type *erase);
684685
struct spi_nor_erase_region *
685686
spi_nor_region_next(struct spi_nor_erase_region *region);
686687
void spi_nor_init_uniform_erase_map(struct spi_nor_erase_map *map,

drivers/mtd/spi-nor/sfdp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,7 +875,7 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
875875
*/
876876
for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++)
877877
if (!(regions_erase_type & BIT(erase[i].idx)))
878-
spi_nor_set_erase_type(&erase[i], 0, 0xFF);
878+
spi_nor_mask_erase_type(&erase[i]);
879879

880880
return 0;
881881
}
@@ -1089,7 +1089,7 @@ static int spi_nor_parse_4bait(struct spi_nor *nor,
10891089
erase_type[i].opcode = (dwords[SFDP_DWORD(2)] >>
10901090
erase_type[i].idx * 8) & 0xFF;
10911091
else
1092-
spi_nor_set_erase_type(&erase_type[i], 0u, 0xFF);
1092+
spi_nor_mask_erase_type(&erase_type[i]);
10931093
}
10941094

10951095
/*

0 commit comments

Comments
 (0)