From: Tomas Mraz Date: Tue, 25 Jan 2022 16:14:52 +0000 (+0100) Subject: lhash: Avoid 32 bit right shift of a 32 bit value X-Git-Tag: openssl-3.2.0-alpha1~3017 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2ce0a3d19005271e7e3c351b562d9da93e2d4c80;p=thirdparty%2Fopenssl.git lhash: Avoid 32 bit right shift of a 32 bit value Fixes #17583 Reviewed-by: Matt Caswell Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/17589) --- diff --git a/crypto/lhash/lhash.c b/crypto/lhash/lhash.c index 62e2be4c18a..b99b63fd6aa 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++;