authorgravatar for paul.verigo@gmail.comPavel Verigo <paul.verigo@gmail.com> 2026-07-16 21:34:40+02:00
committergravatar for paul.verigo@gmail.comPavel Verigo <paul.verigo@gmail.com> 2026-07-22 02:45:32+02:00
logf22d73386441714d59ea080f165979e18204a09d
tree217aabea00eedc980208b9cad499374b9353b57b
parent5faa797309fbe7739b4a211b50f6954f9175f763

std: wasi dirDeleteFile check for directory for PERM/ACCES error


1 files changed, 28 insertions(+), 3 deletions(-)

lib/std/Io/Threaded.zig+28-3
......@@ -7119,9 +7119,10 @@ fn dirDeleteFileWasi(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8) Dir.
71197119 if (builtin.link_libc) return dirDeleteFilePosix(userdata, dir, sub_path);
71207120 const t: *Threaded = @ptrCast(@alignCast(userdata));
71217121 _ = t;
7122 const wasi = std.os.wasi;
71227123 const syscall: Syscall = try .start();
71237124 while (true) {
7124 const res = std.os.wasi.path_unlink_file(dir.handle, sub_path.ptr, sub_path.len);
7125 const res = wasi.path_unlink_file(dir.handle, sub_path.ptr, sub_path.len);
71257126 switch (res) {
71267127 .SUCCESS => {
71277128 syscall.finish();
......@@ -7131,11 +7132,35 @@ fn dirDeleteFileWasi(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8) Dir.
71317132 try syscall.checkCancel();
71327133 continue;
71337134 },
7135 .ACCES, .PERM => |e| {
7136 const original_error: Dir.DeleteFileError = switch (e) {
7137 .ACCES => error.AccessDenied,
7138 .PERM => error.PermissionDenied,
7139 else => unreachable,
7140 };
7141 var stat: wasi.filestat_t = undefined;
7142 while (true) {
7143 try syscall.checkCancel();
7144 switch (wasi.path_filestat_get(dir.handle, .{}, sub_path.ptr, sub_path.len, &stat)) {
7145 .SUCCESS => {
7146 syscall.finish();
7147 break;
7148 },
7149 .INTR => continue,
7150 else => {
7151 syscall.finish();
7152 return original_error;
7153 },
7154 }
7155 }
7156 if (stat.filetype == .DIRECTORY)
7157 return error.IsDir
7158 else
7159 return original_error;
7160 },
71347161 else => |e| {
71357162 syscall.finish();
71367163 switch (e) {
7137 .ACCES => return error.AccessDenied,
7138 .PERM => return error.PermissionDenied,
71397164 .BUSY => return error.FileBusy,
71407165 .FAULT => |err| return errnoBug(err),
71417166 .IO => return error.FileSystem,