From eb163361d9d7b61ee0b93b6f49efd24943c6027d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 14 Jan 2026 19:30:37 -0800 Subject: [PATCH] std.Io.File.MemoryMap: add some alignment type safety --- lib/std/Io/File/MemoryMap.zig | 6 +++--- lib/std/Io/Threaded.zig | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/std/Io/File/MemoryMap.zig b/lib/std/Io/File/MemoryMap.zig index 1c3c6d5fa2a32314483a4ed3c66f1750ff8240f5..0b7ff69bbaab0f7857719a5084a304a78089c9ed 100644 --- a/lib/std/Io/File/MemoryMap.zig +++ b/lib/std/Io/File/MemoryMap.zig @@ -13,9 +13,9 @@ file: File, /// Byte index inside `file` where `memory` starts. Page-aligned. offset: u64, /// Memory that may or may not remain consistent with file contents. Use `read` -/// and `write` to ensure synchronization points. Pointer is page-aligned but -/// length is not. -memory: []u8, +/// and `write` to ensure synchronization points. Length has no alignment +/// requirement. +memory: []align(std.heap.page_size_min) u8, /// Tells whether it is memory-mapped or file operations. On Windows this also /// has a section handle. section: ?Section, diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index bbd375e21f68fe31bb547ff7bdc08095f11d5f57..5c4776b9b88e52efdc00e3988cf7eeb297ab3f8a 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -16198,7 +16198,7 @@ fn fileMemoryMapCreate( return .{ .file = file, .offset = offset, - .memory = memory, + .memory = @alignCast(memory), .section = null, }; } @@ -16283,7 +16283,7 @@ fn createFileMap( return .{ .file = file, .offset = offset, - .memory = contents_ptr.?[0..contents_len], + .memory = @alignCast(contents_ptr.?[0..contents_len]), .section = section, }; } else if (have_mmap) { @@ -16297,6 +16297,8 @@ fn createFileMap( .POPULATE = populate, }; + const page_align = std.heap.page_size_min; + const contents = while (true) { const syscall: Syscall = try .start(); const casted_offset = std.math.cast(i64, offset) orelse return error.Unseekable; @@ -16304,13 +16306,13 @@ fn createFileMap( syscall.finish(); const err: posix.E = if (builtin.link_libc) e: { if (rc != std.c.MAP_FAILED) { - break @as([*]u8, @ptrCast(@alignCast(rc)))[0..aligned_len]; + break @as([*]align(page_align) u8, @ptrCast(@alignCast(rc)))[0..aligned_len]; } break :e @enumFromInt(posix.system._errno().*); } else e: { const err = posix.errno(rc); if (err == .SUCCESS) { - break @as([*]u8, @ptrFromInt(rc))[0..aligned_len]; + break @as([*]align(page_align) u8, @ptrFromInt(rc))[0..aligned_len]; } break :e err; }; @@ -16375,6 +16377,7 @@ fn fileMemoryMapSetLength( const t: *Threaded = @ptrCast(@alignCast(userdata)); const page_size = std.heap.pageSize(); const alignment: Alignment = .fromByteUnits(page_size); + const page_align = std.heap.page_size_min; if (mm.section) |section| { if (alignment.forward(new_len) == alignment.forward(mm.memory.len)) { @@ -16395,11 +16398,11 @@ fn fileMemoryMapSetLength( const rc = posix.system.mremap(mm.memory.ptr, mm.memory.len, new_len, flags, addr_hint); syscall.finish(); const err: posix.E = if (builtin.link_libc) e: { - if (rc != std.c.MAP_FAILED) break @as([*]u8, @ptrCast(@alignCast(rc)))[0..new_len]; + if (rc != std.c.MAP_FAILED) break @as([*]align(page_align) u8, @ptrCast(@alignCast(rc)))[0..new_len]; break :e @enumFromInt(posix.system._errno().*); } else e: { const err = posix.errno(rc); - if (err == .SUCCESS) break @as([*]u8, @ptrFromInt(rc))[0..new_len]; + if (err == .SUCCESS) break @as([*]align(page_align) u8, @ptrFromInt(rc))[0..new_len]; break :e err; }; switch (err) { @@ -16418,10 +16421,11 @@ fn fileMemoryMapSetLength( } else { const gpa = t.allocator; if (gpa.rawRemap(mm.memory, alignment, new_len, @returnAddress())) |new_ptr| { - mm.memory = new_ptr[0..new_len]; + mm.memory = @alignCast(new_ptr[0..new_len]); } else { - const new_ptr = gpa.rawAlloc(new_len, alignment, @returnAddress()) orelse - return error.OutOfMemory; + const new_ptr: [*]align(page_align) u8 = @alignCast( + gpa.rawAlloc(new_len, alignment, @returnAddress()) orelse return error.OutOfMemory, + ); const copy_len = @min(new_len, mm.memory.len); @memcpy(new_ptr[0..copy_len], mm.memory[0..copy_len]); mm.memory = new_ptr[0..new_len]; -- 2.54.0