diff options
author | Tomas Mraz <tomas@openssl.org> | 2022-01-25 17:14:52 +0100 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2022-01-27 10:37:48 +0100 |
commit | 0b13bd04d66d48490e7b27167b27ccccb0086143 (patch) | |
tree | 9eec63277ba7b46370a5d2072a5b3d9c03f7da16 | |
parent | 4c5c2a5efbc315d7926cafbd5a19044ee3e087fa (diff) |
lhash: Avoid 32 bit right shift of a 32 bit value
Fixes #17583
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17589)
(cherry picked from commit 2ce0a3d19005271e7e3c351b562d9da93e2d4c80)
-rw-r--r-- | crypto/lhash/lhash.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/crypto/lhash/lhash.c b/crypto/lhash/lhash.c index 9dc887d91e..7918a74eed 100644 --- a/crypto/lhash/lhash.c +++ b/crypto/lhash/lhash.c @@ -343,7 +343,8 @@ unsigned long OPENSSL_LH_strhash(const char *c) v = n | (*c); n += 0x100; r = (int)((v >> 2) ^ v) & 0x0f; - ret = (ret << r) | (ret >> (32 - r)); + /* cast to uint64_t to avoid 32 bit shift of 32 bit value */ + ret = (ret << r) | (unsigned long)((uint64_t)ret >> (32 - r)); ret &= 0xFFFFFFFFL; ret ^= v * v; c++; @@ -364,7 +365,8 @@ unsigned long openssl_lh_strcasehash(const char *c) for (n = 0x100; *c != '\0'; n += 0x100) { v = n | ossl_tolower(*c); r = (int)((v >> 2) ^ v) & 0x0f; - ret = (ret << r) | (ret >> (32 - r)); + /* cast to uint64_t to avoid 32 bit shift of 32 bit value */ + ret = (ret << r) | (unsigned long)((uint64_t)ret >> (32 - r)); ret &= 0xFFFFFFFFL; ret ^= v * v; c++; |