lib/test_scanf: Handle n_bits == 0 in random tests
PATCH 1/1 lib/test_scanf: Handle n_bits == 0 in random tests
UBSAN reported (via LKP)
[ 11.021349][ T1] UBSAN: shift-out-of-bounds in lib/test_scanf.c:275:51 [ 11.022782][ T1] shift exponent 32 is too large for 32-bit type 'unsigned int'
When n_bits == 0, the shift is out of range. Switch code to use GENMASK to handle this case.
Fixes 50f530e176ea ("lib: test_scanf: Add tests for sscanf number conversion")
Reported-by kernel test robot <[email protected]>
Signed-off-by Andy Shevchenko <[email protected]>
--- lib/test_scanf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
lib/test_scanf.c +2 -2
@@ -271,7 +271,7 @@ static u32 __init next_test_random(u32 max_bits) {u32 n_bits =hweight32 (prandom_u32_state (&rnd_state)) % (max_bits +1 ); -return prandom_u32_state (&rnd_state) & (UINT_MAX >> (32 - n_bits)); +return prandom_u32_state (&rnd_state) &GENMASK (n_bits,0 ); }static unsigned long long __init next_test_random_ull (void )
@@ -280,7 +280,7 @@ static unsigned long long __init next_test_random_ull(void)u32 n_bits = (hweight32 (rand1) *3 ) %64 ;u64 val = (u64 )prandom_u32_state (&rnd_state) * rand1; -return val & (ULLONG_MAX >> (64 - n_bits)); +return val &GENMASK_ULL (n_bits,0 ); }#define random_for_type (T ) \
Signature · 1 line
2.30.2
Quoted 5 lines · Andy Shevchenko
UBSAN reported (via LKP)
[ 11.021349][ T1] UBSAN: shift-out-of-bounds in lib/test_scanf.c:275:51 [ 11.022782][ T1] shift exponent 32 is too large for 32-bit type 'unsigned int'
Quoted 7 lines
When
n_bits== 0, the shift is out of range. Switch code to use GENMASK to handle this case.Fixes 50f530e176ea ("lib: test_scanf: Add tests for sscanf number conversion")Reported-by kernel test robot <[email protected]>Signed-off-by Andy Shevchenko <[email protected]>---
Reviewed-by Richard Fitzgerald <[email protected]>
Sorry about that. Would have been sensible to use GENMASK anyway.
Quoted 11 lines · Andy Shevchenko
UBSAN reported (via LKP)
[ 11.021349][ T1] UBSAN: shift-out-of-bounds in lib/test_scanf.c:275:51 [ 11.022782][ T1] shift exponent 32 is too large for 32-bit type 'unsigned int'When
n_bits== 0, the shift is out of range. Switch code to use GENMASK to handle this case.Fixes 50f530e176ea ("lib: test_scanf: Add tests for sscanf number conversion")Reported-by kernel test robot <[email protected]>Signed-off-by Andy Shevchenko <[email protected]>
The patch is committed in linux/printk.git, branch for-5.15.
I would send it for 4.14 if there was another urgent fix needed. But this one does not look important enough to hurry it up alone.
Best Regards,
Petr