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....@@ -7119,9 +7119,10 @@ fn dirDeleteFileWasi(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8) Dir.
7119 if (builtin.link_libc) return dirDeleteFilePosix(userdata, dir, sub_path);7119 if (builtin.link_libc) return dirDeleteFilePosix(userdata, dir, sub_path);
7120 const t: *Threaded = @ptrCast(@alignCast(userdata));7120 const t: *Threaded = @ptrCast(@alignCast(userdata));
7121 _ = t;7121 _ = t;
7122 const wasi = std.os.wasi;
7122 const syscall: Syscall = try .start();7123 const syscall: Syscall = try .start();
7123 while (true) {7124 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);
7125 switch (res) {7126 switch (res) {
7126 .SUCCESS => {7127 .SUCCESS => {
7127 syscall.finish();7128 syscall.finish();
...@@ -7131,11 +7132,35 @@ fn dirDeleteFileWasi(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8) Dir....@@ -7131,11 +7132,35 @@ fn dirDeleteFileWasi(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8) Dir.
7131 try syscall.checkCancel();7132 try syscall.checkCancel();
7132 continue;7133 continue;
7133 },7134 },
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 },
7134 else => |e| {7161 else => |e| {
7135 syscall.finish();7162 syscall.finish();
7136 switch (e) {7163 switch (e) {
7137 .ACCES => return error.AccessDenied,
7138 .PERM => return error.PermissionDenied,
7139 .BUSY => return error.FileBusy,7164 .BUSY => return error.FileBusy,
7140 .FAULT => |err| return errnoBug(err),7165 .FAULT => |err| return errnoBug(err),
7141 .IO => return error.FileSystem,7166 .IO => return error.FileSystem,