From: Mark Andrews Date: Mon, 28 Feb 2022 02:43:20 +0000 (+1100) Subject: Use unsigned arithmetic when shifting by 24 X-Git-Tag: v9.16.27~6^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a247d282bf138eb2fd6474053ea4a648371eb9b0;p=thirdparty%2Fbind9.git Use unsigned arithmetic when shifting by 24 By default C promotes short unsigned values to signed int which leads to undefined behaviour when the value is shifted by too much. Force unsigned arithmetic to be perform by explicitly casting to a unsigned type. (cherry picked from commit b8b99603f117825f409cb2d49bc90ef188749227) --- diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 8e353f1c59a..69beef7fbb3 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -111,7 +111,8 @@ index_to_disk(dns_journal_t *); static inline uint32_t decode_uint32(unsigned char *p) { - return ((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + (p[3] << 0)); + return (((uint32_t)p[0] << 24) + ((uint32_t)p[1] << 16) + + ((uint32_t)p[2] << 8) + ((uint32_t)p[3] << 0)); } static inline void diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index acb35d22e61..f99d8a6c126 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -8974,8 +8974,9 @@ rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) { #if DNS_RDATASET_FIXED if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) != 0) { unsigned int offset; - offset = (raw[0] << 24) + (raw[1] << 16) + (raw[2] << 8) + - raw[3]; + offset = ((unsigned int)raw[0] << 24) + + ((unsigned int)raw[1] << 16) + + ((unsigned int)raw[2] << 8) + (unsigned int)raw[3]; raw = rdataset->private3; raw += offset; } diff --git a/lib/dns/soa.c b/lib/dns/soa.c index d02be34e863..82edfd437ed 100644 --- a/lib/dns/soa.c +++ b/lib/dns/soa.c @@ -25,7 +25,8 @@ static inline uint32_t decode_uint32(unsigned char *p) { - return ((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + (p[3] << 0)); + return (((uint32_t)p[0] << 24) + ((uint32_t)p[1] << 16) + + ((uint32_t)p[2] << 8) + ((uint32_t)p[3] << 0)); } static inline void