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)
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
#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;
}
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