From a4a148cf9a44d54feda939eb4cdc6ff30ca74880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Thu, 30 Nov 2017 18:23:35 +0100 Subject: [PATCH] [master] Type the shifted values to isc_uint32_t so the top bit is unsigned (found by UBSAN) [RT #46740] --- bin/tests/atomic/t_atomic.c | 4 ++-- lib/dns/dispatch.c | 4 ++-- lib/dns/rbtdb.c | 2 +- lib/dns/rdata.c | 8 ++++---- lib/isc/portset.c | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bin/tests/atomic/t_atomic.c b/bin/tests/atomic/t_atomic.c index 67ef53354f..4f5337dd7f 100644 --- a/bin/tests/atomic/t_atomic.c +++ b/bin/tests/atomic/t_atomic.c @@ -181,7 +181,7 @@ static void do_store(isc_task_t *task, isc_event_t *ev) { counter_t *state = (counter_t *)ev->ev_arg; int i; - isc_uint8_t r; + isc_uint32_t r; isc_uint32_t val; r = random() % 256; @@ -205,7 +205,7 @@ test_atomic_store() { isc_task_t *tasks[TASKS]; isc_event_t *event; int i; - isc_uint8_t r; + isc_uint32_t r; isc_uint32_t val; t_assert("test_atomic_store", 1, T_REQUIRED, "%s", diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index da40fa6263..5707abd53e 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -421,10 +421,10 @@ static isc_uint32_t dns_hash(dns_qid_t *qid, const isc_sockaddr_t *dest, dns_messageid_t id, in_port_t port) { - unsigned int ret; + isc_uint32_t ret; ret = isc_sockaddr_hash(dest, ISC_TRUE); - ret ^= (id << 16) | port; + ret ^= ((isc_uint32_t)id << 16) | port; ret %= qid->qid_nbuckets; INSIST(ret < qid->qid_nbuckets); diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 041d757c11..4ff1f45866 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -307,7 +307,7 @@ typedef isc_uint32_t rbtdb_rdatatype_t; #define RBTDB_RDATATYPE_BASE(type) ((dns_rdatatype_t)((type) & 0xFFFF)) #define RBTDB_RDATATYPE_EXT(type) ((dns_rdatatype_t)((type) >> 16)) -#define RBTDB_RDATATYPE_VALUE(b, e) ((rbtdb_rdatatype_t)((e) << 16) | (b)) +#define RBTDB_RDATATYPE_VALUE(base, ext) ((rbtdb_rdatatype_t)(((isc_uint32_t)ext) << 16) | ((isc_uint32_t)base) & 0xffff) #define RBTDB_RDATATYPE_SIGNSEC \ RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_nsec) diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index 04e02a63a6..204729c441 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -1796,10 +1796,10 @@ uint32_fromregion(isc_region_t *region) { isc_uint32_t value; REQUIRE(region->length >= 4); - value = region->base[0] << 24; - value |= region->base[1] << 16; - value |= region->base[2] << 8; - value |= region->base[3]; + value = (isc_uint32_t)region->base[0] << 24; + value |= (isc_uint32_t)region->base[1] << 16; + value |= (isc_uint32_t)region->base[2] << 8; + value |= (isc_uint32_t)region->base[3]; return(value); } diff --git a/lib/isc/portset.c b/lib/isc/portset.c index 21dfd6d83a..a5843c1013 100644 --- a/lib/isc/portset.c +++ b/lib/isc/portset.c @@ -32,14 +32,14 @@ struct isc_portset { static inline isc_boolean_t portset_isset(isc_portset_t *portset, in_port_t port) { - return (ISC_TF((portset->buf[port >> 5] & (1 << (port & 31))) != 0)); + return (ISC_TF((portset->buf[port >> 5] & ((isc_uint32_t)1 << (port & 31))) != 0)); } static inline void portset_add(isc_portset_t *portset, in_port_t port) { if (!portset_isset(portset, port)) { portset->nports++; - portset->buf[port >> 5] |= (1 << (port & 31)); + portset->buf[port >> 5] |= ((isc_uint32_t)1 << (port & 31)); } } @@ -47,7 +47,7 @@ static inline void portset_remove(isc_portset_t *portset, in_port_t port) { if (portset_isset(portset, port)) { portset->nports--; - portset->buf[port >> 5] &= ~(1 << (port & 31)); + portset->buf[port >> 5] &= ~((isc_uint32_t)1 << (port & 31)); } }