zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1cc388d5263058f9e9eecc410eea825a9a58e143 (tree)
parent ecc76348e6858f00b920d8dc9e44a6e703d8e497
Author: Alec Fessler <afessler1998@gmail.com>
Date:   Sat, 22 Feb 2025 15:07:44 -0500

stdlib: handle EEXIST in mmap with FIXED_NOREPLACE. Fixes #21475

Diffstat:
Mlib/std/Thread.zig | 1+
Mlib/std/debug/Dwarf.zig | 7+++++--
Mlib/std/posix.zig | 4++++
3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig @@ -1420,6 +1420,7 @@ const LinuxThreadImpl = struct { error.PermissionDenied => unreachable, error.ProcessFdQuotaExceeded => unreachable, error.SystemFdQuotaExceeded => unreachable, + error.MappingAlreadyExists => unreachable, else => |e| return e, }; assert(mapped.len >= map_bytes); diff --git a/lib/std/debug/Dwarf.zig b/lib/std/debug/Dwarf.zig @@ -2434,14 +2434,17 @@ pub const ElfModule = struct { const end_pos = elf_file.getEndPos() catch return bad(); const file_len = cast(usize, end_pos) orelse return error.Overflow; - const mapped_mem = try std.posix.mmap( + const mapped_mem = std.posix.mmap( null, file_len, std.posix.PROT.READ, .{ .TYPE = .SHARED }, elf_file.handle, 0, - ); + ) catch |err| switch (err) { + error.MappingAlreadyExists => unreachable, + else => |e| return e, + }; errdefer std.posix.munmap(mapped_mem); return load( diff --git a/lib/std/posix.zig b/lib/std/posix.zig @@ -4754,6 +4754,9 @@ pub const MMapError = error{ ProcessFdQuotaExceeded, SystemFdQuotaExceeded, OutOfMemory, + + /// Using FIXED_NOREPLACE flag and the process has already mapped memory at the given address + MappingAlreadyExists, } || UnexpectedError; /// Map files or devices into memory. @@ -4792,6 +4795,7 @@ pub fn mmap( .MFILE => return error.ProcessFdQuotaExceeded, .NFILE => return error.SystemFdQuotaExceeded, .NOMEM => return error.OutOfMemory, + .EXIST => return error.MappingAlreadyExists, else => return unexpectedErrno(err), } }