summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-02-14 07:28:09 -0800
committerKaz Kylheku <kaz@kylheku.com>2022-02-14 07:28:09 -0800
commitf18e1281886b5300c62ad362d77aaecd32c0b1d3 (patch)
treea36c69192c30d673a256c039ab5e9945023380f5
parent75d97b5699cb861e53a46a9be886d11695f1ad76 (diff)
downloadtxr-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.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/rand.c b/rand.c
index 3e676ff1..934f62a8 100644
--- a/rand.c
+++ b/rand.c
@@ -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);