authorgravatar for afessler1998@gmail.comAlec Fessler <afessler1998@gmail.com> 2025-02-22 15:07:44-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-24 04:36:14-05:00
log1cc388d5263058f9e9eecc410eea825a9a58e143
tree90a02eaeeb263bd175a9525fd27e16d8eb269acb
parentecc76348e6858f00b920d8dc9e44a6e703d8e497

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


3 files changed, 10 insertions(+), 2 deletions(-)

lib/std/Thread.zig+1
...@@ -1420,6 +1420,7 @@ const LinuxThreadImpl = struct {...@@ -1420,6 +1420,7 @@ const LinuxThreadImpl = struct {
1420 error.PermissionDenied => unreachable,1420 error.PermissionDenied => unreachable,
1421 error.ProcessFdQuotaExceeded => unreachable,1421 error.ProcessFdQuotaExceeded => unreachable,
1422 error.SystemFdQuotaExceeded => unreachable,1422 error.SystemFdQuotaExceeded => unreachable,
1423 error.MappingAlreadyExists => unreachable,
1423 else => |e| return e,1424 else => |e| return e,
1424 };1425 };
1425 assert(mapped.len >= map_bytes);1426 assert(mapped.len >= map_bytes);
lib/std/debug/Dwarf.zig+5-2
...@@ -2434,14 +2434,17 @@ pub const ElfModule = struct {...@@ -2434,14 +2434,17 @@ pub const ElfModule = struct {
2434 const end_pos = elf_file.getEndPos() catch return bad();2434 const end_pos = elf_file.getEndPos() catch return bad();
2435 const file_len = cast(usize, end_pos) orelse return error.Overflow;2435 const file_len = cast(usize, end_pos) orelse return error.Overflow;
24362436
2437 const mapped_mem = try std.posix.mmap(2437 const mapped_mem = std.posix.mmap(
2438 null,2438 null,
2439 file_len,2439 file_len,
2440 std.posix.PROT.READ,2440 std.posix.PROT.READ,
2441 .{ .TYPE = .SHARED },2441 .{ .TYPE = .SHARED },
2442 elf_file.handle,2442 elf_file.handle,
2443 0,2443 0,
2444 );2444 ) catch |err| switch (err) {
2445 error.MappingAlreadyExists => unreachable,
2446 else => |e| return e,
2447 };
2445 errdefer std.posix.munmap(mapped_mem);2448 errdefer std.posix.munmap(mapped_mem);
24462449
2447 return load(2450 return load(
lib/std/posix.zig+4
...@@ -4754,6 +4754,9 @@ pub const MMapError = error{...@@ -4754,6 +4754,9 @@ pub const MMapError = error{
4754 ProcessFdQuotaExceeded,4754 ProcessFdQuotaExceeded,
4755 SystemFdQuotaExceeded,4755 SystemFdQuotaExceeded,
4756 OutOfMemory,4756 OutOfMemory,
4757
4758 /// Using FIXED_NOREPLACE flag and the process has already mapped memory at the given address
4759 MappingAlreadyExists,
4757} || UnexpectedError;4760} || UnexpectedError;
47584761
4759/// Map files or devices into memory.4762/// Map files or devices into memory.
...@@ -4792,6 +4795,7 @@ pub fn mmap(...@@ -4792,6 +4795,7 @@ pub fn mmap(
4792 .MFILE => return error.ProcessFdQuotaExceeded,4795 .MFILE => return error.ProcessFdQuotaExceeded,
4793 .NFILE => return error.SystemFdQuotaExceeded,4796 .NFILE => return error.SystemFdQuotaExceeded,
4794 .NOMEM => return error.OutOfMemory,4797 .NOMEM => return error.OutOfMemory,
4798 .EXIST => return error.MappingAlreadyExists,
4795 else => return unexpectedErrno(err),4799 else => return unexpectedErrno(err),
4796 }4800 }
4797}4801}