From cd7d0f78476c6612e8ff94dceb4c73fe873c133b Mon Sep 17 00:00:00 2001 From: garrisonhh Date: Tue, 5 Mar 2024 09:31:37 -0500 Subject: [PATCH 1/2] std.os: make access respect EPERM; make AccessError consistent access and accessat family of functions: - recognize EPERM as AccessError.PermissionDenied - recognize EACCES as AccessError.AccessDenied, which is consistent with other functions in std.os --- lib/std/os.zig | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/std/os.zig b/lib/std/os.zig index 541d70e3fc51..747d27423e8a 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -4844,6 +4844,7 @@ pub fn msync(memory: []align(mem.page_size) u8, flags: i32) MSyncError!void { } pub const AccessError = error{ + AccessDenied, PermissionDenied, FileNotFound, NameTooLong, @@ -4867,10 +4868,7 @@ pub const AccessError = error{ /// TODO currently this assumes `mode` is `F.OK` on Windows. pub fn access(path: []const u8, mode: u32) AccessError!void { if (builtin.os.tag == .windows) { - const path_w = windows.sliceToPrefixedFileW(null, path) catch |err| switch (err) { - error.AccessDenied => return error.PermissionDenied, - else => |e| return e, - }; + const path_w = try windows.sliceToPrefixedFileW(null, path); _ = try windows.GetFileAttributesW(path_w.span().ptr); return; } else if (builtin.os.tag == .wasi and !builtin.link_libc) { @@ -4883,10 +4881,7 @@ pub fn access(path: []const u8, mode: u32) AccessError!void { /// Same as `access` except `path` is null-terminated. pub fn accessZ(path: [*:0]const u8, mode: u32) AccessError!void { if (builtin.os.tag == .windows) { - const path_w = windows.cStrToPrefixedFileW(null, path) catch |err| switch (err) { - error.AccessDenied => return error.PermissionDenied, - else => |e| return e, - }; + const path_w = windows.cStrToPrefixedFileW(null, path); _ = try windows.GetFileAttributesW(path_w.span().ptr); return; } else if (builtin.os.tag == .wasi and !builtin.link_libc) { @@ -4894,7 +4889,8 @@ pub fn accessZ(path: [*:0]const u8, mode: u32) AccessError!void { } switch (errno(system.access(path, mode))) { .SUCCESS => return, - .ACCES => return error.PermissionDenied, + .ACCES => return error.AccessDenied, + .PERM => return error.PermissionDenied, .ROFS => return error.ReadOnlyFileSystem, .LOOP => return error.SymLinkLoop, .TXTBSY => return error.FileBusy, @@ -4925,7 +4921,7 @@ pub fn accessW(path: [*:0]const u16, mode: u32) windows.GetFileAttributesError!v switch (windows.kernel32.GetLastError()) { .FILE_NOT_FOUND => return error.FileNotFound, .PATH_NOT_FOUND => return error.FileNotFound, - .ACCESS_DENIED => return error.PermissionDenied, + .ACCESS_DENIED => return error.AccessDenied, else => |err| return windows.unexpectedError(err), } } @@ -4993,7 +4989,8 @@ 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, + .ACCES => return error.AccessDenied, + .PERM => return error.PermissionDenied, .ROFS => return error.ReadOnlyFileSystem, .LOOP => return error.SymLinkLoop, .TXTBSY => return error.FileBusy, @@ -5046,7 +5043,7 @@ pub fn faccessatW(dirfd: fd_t, sub_path_w: [*:0]const u16, mode: u32, flags: u32 .OBJECT_PATH_NOT_FOUND => return error.FileNotFound, .OBJECT_NAME_INVALID => unreachable, .INVALID_PARAMETER => unreachable, - .ACCESS_DENIED => return error.PermissionDenied, + .ACCESS_DENIED => return error.AccessDenied, .OBJECT_PATH_SYNTAX_BAD => unreachable, else => |rc| return windows.unexpectedStatus(rc), } From a6c3ec5d0441256c5c29a797dcf24aa51dc98351 Mon Sep 17 00:00:00 2001 From: garrisonhh Date: Tue, 5 Mar 2024 10:13:49 -0500 Subject: [PATCH 2/2] std.os.windows: ACCESS_DENIED always becomes error.AccessDenied --- lib/std/os/windows.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index deb903b2838a..b6e6a02796ac 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -1283,7 +1283,7 @@ pub fn GetFileSizeEx(hFile: HANDLE) GetFileSizeError!u64 { pub const GetFileAttributesError = error{ FileNotFound, - PermissionDenied, + AccessDenied, Unexpected, }; @@ -1298,7 +1298,7 @@ pub fn GetFileAttributesW(lpFileName: [*:0]const u16) GetFileAttributesError!DWO switch (kernel32.GetLastError()) { .FILE_NOT_FOUND => return error.FileNotFound, .PATH_NOT_FOUND => return error.FileNotFound, - .ACCESS_DENIED => return error.PermissionDenied, + .ACCESS_DENIED => return error.AccessDenied, else => |err| return unexpectedError(err), } } @@ -1513,12 +1513,12 @@ pub fn GetModuleFileNameW(hModule: ?HMODULE, buf_ptr: [*]u16, buf_len: DWORD) Ge return buf_ptr[0..rc :0]; } -pub const TerminateProcessError = error{ PermissionDenied, Unexpected }; +pub const TerminateProcessError = error{ AccessDenied, Unexpected }; pub fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) TerminateProcessError!void { if (kernel32.TerminateProcess(hProcess, uExitCode) == 0) { switch (kernel32.GetLastError()) { - Win32Error.ACCESS_DENIED => return error.PermissionDenied, + Win32Error.ACCESS_DENIED => return error.AccessDenied, else => |err| return unexpectedError(err), } }