From 52ba2a4c72cee39292d09506655197811feceede Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 19 Dec 2025 16:19:01 -0800 Subject: std.Io.Threaded: don't assume dirents are aligned Linux kernel seems to do it but qemu user mode seems not to. --- lib/std/Io/Threaded.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/std') 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; -- cgit v1.2.3