diff --git a/include/endianness.hh b/include/endianness.hh index 28ba4e7..9984196 100644 --- a/include/endianness.hh +++ b/include/endianness.hh @@ -1,6 +1,7 @@ // Copyright SCI Semiconductor and CHERIoT Contributors. // SPDX-License-Identifier: MIT +#include "cdefs.h" #include uint16_t constexpr ntohs(uint16_t value) @@ -24,3 +25,11 @@ uint16_t constexpr htons(uint16_t value) #endif ; } + +template +__always_inline T read_unaligned(const void *p) +{ + T val; + __builtin_memcpy(&val, p, sizeof(T)); + return val; +} diff --git a/lib/dns/dns.cc b/lib/dns/dns.cc index b59bfdf..4b138f4 100644 --- a/lib/dns/dns.cc +++ b/lib/dns/dns.cc @@ -808,12 +808,12 @@ namespace if (isIPv6) { queryResult.kind = NetworkAddress::AddressKindIPv6; - uint16_t *ipv6 = reinterpret_cast(&queryResult.ipv6[0]); + uint8_t *ipv6 = queryResult.ipv6; // Enforce machine byte order by block of 2 byte. for (int i = 0; i < 8; i++) { - *ipv6++ = ntohs( - *reinterpret_cast(dnsPacket + currentOffset)); + *ipv6++ = + ntohs(read_unaligned(dnsPacket + currentOffset)); currentOffset += 2; } } @@ -1110,15 +1110,15 @@ __cheri_compartment("DNS") int network_host_resolve(Timeout *timeout, { Debug::log("Resolved {} -> {}:{}:{}:{}:{}:{}:{}:{}", hostname, - *reinterpret_cast(&queryResult.ipv6[0]), - *reinterpret_cast(&queryResult.ipv6[2]), - *reinterpret_cast(&queryResult.ipv6[4]), - *reinterpret_cast(&queryResult.ipv6[6]), - *reinterpret_cast(&queryResult.ipv6[8]), - *reinterpret_cast(&queryResult.ipv6[10]), - *reinterpret_cast(&queryResult.ipv6[12]), - *reinterpret_cast(&queryResult.ipv6[14]), - *reinterpret_cast(&queryResult.ipv6[16])); + read_unaligned(&queryResult.ipv6[0]), + read_unaligned(&queryResult.ipv6[2]), + read_unaligned(&queryResult.ipv6[4]), + read_unaligned(&queryResult.ipv6[6]), + read_unaligned(&queryResult.ipv6[8]), + read_unaligned(&queryResult.ipv6[10]), + read_unaligned(&queryResult.ipv6[12]), + read_unaligned(&queryResult.ipv6[14]), + read_unaligned(&queryResult.ipv6[16])); } // We are now good to process the next lookup. diff --git a/lib/dns/protocol-headers.hh b/lib/dns/protocol-headers.hh index c78c1d0..d2bd41c 100644 --- a/lib/dns/protocol-headers.hh +++ b/lib/dns/protocol-headers.hh @@ -68,7 +68,7 @@ uint16_t compute_ipv4_checksum(const uint8_t *header, uint16_t length) while (length > 1) { - sum += *reinterpret_cast(header); + sum += read_unaligned(header); header += 2; length -= 2; }