aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Io
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-12-19 16:19:01 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-12-23 22:15:11 -0800
commit52ba2a4c72cee39292d09506655197811feceede (patch)
treef438c100d0c5d40094da3871250bfcaed11a2e9b /lib/std/Io
parent6cfd2df695df04834b935c21b1b40ddac0d39594 (diff)
downloadzig-52ba2a4c72cee39292d09506655197811feceede.tar.gz
zig-52ba2a4c72cee39292d09506655197811feceede.zip
std.Io.Threaded: don't assume dirents are aligned
Linux kernel seems to do it but qemu user mode seems not to.
Diffstat (limited to 'lib/std/Io')
-rw-r--r--lib/std/Io/Threaded.zig5
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig
index 55c0ad4265..f4d60b3934 100644
--- a/lib/std/Io/Threaded.zig
+++ b/lib/std/Io/Threaded.zig
@@ -3440,7 +3440,10 @@ fn dirReadLinux(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir
// by looking at only the 8 bytes before the next record. However since
// file names are usually short it's better to keep the machine code
// simpler.
- const linux_entry: *linux.dirent64 = @ptrCast(@alignCast(&dr.buffer[dr.index]));
+ //
+ // Furthermore, I observed qemu user mode to not align this struct, so
+ // this code makes the conservative choice to not assume alignment.
+ const linux_entry: *align(1) linux.dirent64 = @ptrCast(&dr.buffer[dr.index]);
const next_index = dr.index + linux_entry.reclen;
dr.index = next_index;
const name_ptr: [*]u8 = &linux_entry.name;