Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions include/endianness.hh
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright SCI Semiconductor and CHERIoT Contributors.
// SPDX-License-Identifier: MIT

#include "cdefs.h"
#include <stdint.h>

uint16_t constexpr ntohs(uint16_t value)
Expand All @@ -24,3 +25,11 @@ uint16_t constexpr htons(uint16_t value)
#endif
;
}

template<class T>
__always_inline T read_unaligned(const void *p)
{
T val;
__builtin_memcpy(&val, p, sizeof(T));
return val;
}
24 changes: 12 additions & 12 deletions lib/dns/dns.cc
Original file line number Diff line number Diff line change
Expand Up @@ -808,12 +808,12 @@ namespace
if (isIPv6)
{
queryResult.kind = NetworkAddress::AddressKindIPv6;
uint16_t *ipv6 = reinterpret_cast<uint16_t *>(&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<uint16_t *>(dnsPacket + currentOffset));
*ipv6++ =
ntohs(read_unaligned<uint16_t>(dnsPacket + currentOffset));
currentOffset += 2;
}
}
Expand Down Expand Up @@ -1110,15 +1110,15 @@ __cheri_compartment("DNS") int network_host_resolve(Timeout *timeout,
{
Debug::log("Resolved {} -> {}:{}:{}:{}:{}:{}:{}:{}",
hostname,
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[0]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[2]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[4]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[6]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[8]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[10]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[12]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[14]),
*reinterpret_cast<uint16_t *>(&queryResult.ipv6[16]));
read_unaligned<uint16_t>(&queryResult.ipv6[0]),
read_unaligned<uint16_t>(&queryResult.ipv6[2]),
read_unaligned<uint16_t>(&queryResult.ipv6[4]),
read_unaligned<uint16_t>(&queryResult.ipv6[6]),
read_unaligned<uint16_t>(&queryResult.ipv6[8]),
read_unaligned<uint16_t>(&queryResult.ipv6[10]),
read_unaligned<uint16_t>(&queryResult.ipv6[12]),
read_unaligned<uint16_t>(&queryResult.ipv6[14]),
read_unaligned<uint16_t>(&queryResult.ipv6[16]));
}

// We are now good to process the next lookup.
Expand Down
2 changes: 1 addition & 1 deletion lib/dns/protocol-headers.hh
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ uint16_t compute_ipv4_checksum(const uint8_t *header, uint16_t length)

while (length > 1)
{
sum += *reinterpret_cast<const uint16_t *>(header);
sum += read_unaligned<uint16_t>(header);
header += 2;
length -= 2;
}
Expand Down
Loading