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 b8b99603f1)
This commit is contained in:
+2
-1
@@ -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
|
||||
|
||||
+3
-2
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user