commit 44015e369771772c8561bc961cc38ed079702aed
parent 5d17acdbc7659af543e05e02c49e4989435e6eaf
Author: Sebastian <sebastian@sebsite.pw>
Date: Sat, 7 Sep 2024 16:40:27 -0400
all: fix misaligned memory accesses
Some of these aren't ever actually misaligned on targets we currently
support, since stack-allocated meemory is at a minimum aligned as 4. But
it's still good to fix them to not rely on this behavior.
Signed-off-by: Sebastian <sebastian@sebsite.pw>
Diffstat:
6 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/net/dial/resolve.ha b/net/dial/resolve.ha
@@ -106,9 +106,8 @@ fn resolve_addr(addr: str) ([]ip::addr | error) = {
const domain = dns::parse_domain(addr);
defer free(domain);
- let rand: []u8 = [0, 0];
- random::buffer(rand);
- let id = *(&rand[0]: *u16);
+ let id = 0u16;
+ random::buffer(&id: *[size(u16)]u8);
const query6 = dns::message {
header = dns::header {
diff --git a/net/ip/+freebsd.ha b/net/ip/+freebsd.ha
@@ -7,12 +7,15 @@ use rt;
export fn to_native(a: addr, port: u16) rt::sockaddr = {
match (a) {
case let v4: addr4 =>
+ const addr = rt::in_addr {
+ s_addr = endian::host.getu32(v4),
+ };
return rt::sockaddr {
in = rt::sockaddr_in {
sin_len = size(rt::in_addr): u8,
sin_family = rt::AF_INET,
sin_port = endian::htonu16(port),
- sin_addr = rt::in_addr { s_addr = *(&v4[0]: *opaque: *u32) },
+ sin_addr = addr,
...
},
...
diff --git a/net/ip/+linux.ha b/net/ip/+linux.ha
@@ -7,11 +7,14 @@ use rt;
export fn to_native(a: addr, port: u16) rt::sockaddr = {
match (a) {
case let v4: addr4 =>
+ const addr = rt::in_addr {
+ s_addr = endian::host.getu32(v4),
+ };
return rt::sockaddr {
in = rt::sockaddr_in {
sin_family = rt::AF_INET,
sin_port = endian::htonu16(port),
- sin_addr = rt::in_addr { s_addr = *(&v4[0]: *opaque: *u32) },
+ sin_addr = addr,
...
},
...
diff --git a/net/ip/+openbsd.ha b/net/ip/+openbsd.ha
@@ -7,12 +7,15 @@ use rt;
export fn to_native(a: addr, port: u16) rt::sockaddr = {
match (a) {
case let v4: addr4 =>
+ const addr = rt::in_addr {
+ s_addr = endian::host.getu32(v4),
+ };
return rt::sockaddr {
in = rt::sockaddr_in {
sin_len = size(rt::in_addr): u8,
sin_family = rt::AF_INET,
sin_port = endian::htonu16(port),
- sin_addr = rt::in_addr { s_addr = *(&v4[0]: *u32) },
+ sin_addr = addr,
...
},
...
diff --git a/temp/+freebsd.ha b/temp/+freebsd.ha
@@ -50,10 +50,9 @@ export fn named(
static let pathbuf = path::buffer { ... };
static let namebuf: [32]u8 = [0...];
for (true) {
- let rand: [size(u64)]u8 = [0...];
- random::buffer(rand);
+ let id = 0u64;
+ random::buffer(&id: *[size(u64)]u8);
- const id = *(&rand[0]: *u64);
const name = fmt::bsprintf(namebuf, "temp.{}", id);
const path = path::set(&pathbuf, path, name)!;
diff --git a/temp/+linux.ha b/temp/+linux.ha
@@ -60,10 +60,9 @@ export fn named(
static let pathbuf = path::buffer { ... };
static let namebuf: [32]u8 = [0...];
for (true) {
- let rand: [size(u64)]u8 = [0...];
- random::buffer(rand);
+ let id = 0u64;
+ random::buffer(&id: *[size(u64)]u8);
- const id = *(&rand[0]: *u64);
const name = fmt::bsprintf(namebuf, "temp.{}", id);
const path = path::set(&pathbuf, path, name)!;