From 838eaf5e69d8c1279eefd1b431b6d4a4c3a9a709 Mon Sep 17 00:00:00 2001 From: Pat Tullmann Date: Tue, 18 Feb 2025 17:04:19 -0800 Subject: [PATCH] posix: access/accessZ/faccessat/faccessatZ can return AccessDenied or PermissionDenied `EACCES` is returned if the file mode bit (i.e., user/group/other rwx bits) disallow access. `EPERM` is returned if something else denies access (immutable bit, SELinux, capabilities, etc). This somewhat subtle no-access distinction is part of POSIX. For now map both to `error.PermissionDenied` to keep the error signature unchanged. See duopoly. This PR is effecitvely an update/simplification of PR #19193. Tested locally with an immutable file. Fixes #22733 and #19162. --- lib/std/posix.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 27f76772690b..4dd93f719fd8 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -4914,6 +4914,7 @@ pub fn accessZ(path: [*:0]const u8, mode: u32) AccessError!void { switch (errno(system.access(path, mode))) { .SUCCESS => return, .ACCES => return error.PermissionDenied, + .PERM => return error.PermissionDenied, .ROFS => return error.ReadOnlyFileSystem, .LOOP => return error.SymLinkLoop, .TXTBSY => return error.FileBusy, @@ -4999,6 +5000,7 @@ pub fn faccessatZ(dirfd: fd_t, path: [*:0]const u8, mode: u32, flags: u32) Acces switch (errno(system.faccessat(dirfd, path, mode, flags))) { .SUCCESS => return, .ACCES => return error.PermissionDenied, + .PERM => return error.PermissionDenied, .ROFS => return error.ReadOnlyFileSystem, .LOOP => return error.SymLinkLoop, .TXTBSY => return error.FileBusy,