diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-02-14 07:28:09 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-02-14 07:28:09 -0800 |
commit | f18e1281886b5300c62ad362d77aaecd32c0b1d3 (patch) | |
tree | a36c69192c30d673a256c039ab5e9945023380f5 | |
parent | 75d97b5699cb861e53a46a9be886d11695f1ad76 (diff) | |
download | txr-f18e1281886b5300c62ad362d77aaecd32c0b1d3.tar.gz txr-f18e1281886b5300c62ad362d77aaecd32c0b1d3.tar.bz2 txr-f18e1281886b5300c62ad362d77aaecd32c0b1d3.zip |
random: shift bug uncovered by ubsan.
* rand.c (random): When calculating the msb_rand_mask, avoid
shifting a 32 bit value by 32 bits. In that case we want the
mask to be 0xFFFFFFFF, so we shift by zero.
-rw-r--r-- | rand.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -366,7 +366,9 @@ val random(val state, val modulus) ucnum bits = mp_count_bits(m) - mp_is_pow_two(m); ucnum rands_needed = (bits + 32 - 1) / 32; ucnum msb_rand_bits = bits % 32; - rand32_t msb_rand_mask = convert(rand32_t, -1) >> (32 - msb_rand_bits); + rand32_t msb_rand_mask = convert(rand32_t, -1) >> (msb_rand_bits + ? 32 - msb_rand_bits + : 0); val out = make_bignum(); mp_int *om = mp(out); |