summaryrefslogtreecommitdiffstats
path: root/crypto/lhash
diff options
context:
space:
mode:
authorTomas Mraz <tomas@openssl.org>2022-01-25 17:14:52 +0100
committerTomas Mraz <tomas@openssl.org>2022-01-27 10:36:57 +0100
commit2ce0a3d19005271e7e3c351b562d9da93e2d4c80 (patch)
tree2727324e0278a111d02561924e54500eeac08ea8 /crypto/lhash
parentd450eb84c802b2f78971f905b251a0fb89ebb7d1 (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)
Diffstat (limited to 'crypto/lhash')
-rw-r--r--crypto/lhash/lhash.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/crypto/lhash/lhash.c b/crypto/lhash/lhash.c
index 62e2be4c18..b99b63fd6a 100644
--- a/crypto/lhash/lhash.c
+++ b/crypto/lhash/lhash.c
@@ -383,7 +383,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++;
@@ -404,7 +405,8 @@ unsigned long ossl_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++;