Prevent overflow in hash function str2tag_core() (#1529)

* str2tag_core(): prevent overflow

* Update httplib.h

works for all sizes of unsigned int and if there exists a #define for max
This commit is contained in:
Johannes Flügel 2023-03-22 19:16:32 +01:00 committed by GitHub
parent 5745eabe69
commit d262033ded
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2978,9 +2978,13 @@ inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) {
inline constexpr unsigned int str2tag_core(const char *s, size_t l, inline constexpr unsigned int str2tag_core(const char *s, size_t l,
unsigned int h) { unsigned int h) {
return (l == 0) ? h return (l == 0)
: str2tag_core(s + 1, l - 1, ? h
(h * 33) ^ static_cast<unsigned char>(*s)); : str2tag_core(
s + 1, l - 1,
//unsets the 6 high bits of h, therefore no overflow happens
(((std::numeric_limits<unsigned int>::max)() >> 6) & h * 33) ^
static_cast<unsigned char>(*s));
} }
inline unsigned int str2tag(const std::string &s) { inline unsigned int str2tag(const std::string &s) {