diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index b9a0474de99359e7f6f04f50e5a222dc466a06c5..212ee2fba18bcff3c33bcdaf8ae66fb7dff8fd9c 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -7987,6 +7987,9 @@ fn fileReadStreamingWindows(userdata: ?*anyopaque, file: File, data: []const []u .LOCK_VIOLATION => return syscall.fail(error.LockViolation), .ACCESS_DENIED => return syscall.fail(error.AccessDenied), .INVALID_HANDLE => return syscall.fail(error.NotOpenForReading), + // TODO: Determine if INVALID_FUNCTION is possible in more scenarios than just passing + // a handle to a directory. + .INVALID_FUNCTION => return syscall.fail(error.IsDir), else => |err| { syscall.finish(); return windows.unexpectedError(err); @@ -8144,6 +8147,9 @@ fn fileReadPositionalWindows(userdata: ?*anyopaque, file: File, data: []const [] .LOCK_VIOLATION => return syscall.fail(error.LockViolation), .ACCESS_DENIED => return syscall.fail(error.AccessDenied), .INVALID_HANDLE => return syscall.fail(error.NotOpenForReading), + // TODO: Determine if INVALID_FUNCTION is possible in more scenarios than just passing + // a handle to a directory. + .INVALID_FUNCTION => return syscall.fail(error.IsDir), else => |err| { syscall.finish(); return windows.unexpectedError(err); diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 63c51e6ed5b7429af7be18379a41fa30cd9c81d3..59cc05f1c1ec7faa893555a0c312f92a5fa6e8d0 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -847,7 +847,16 @@ test "file operations on directories" { { const handle = try ctx.dir.openFile(io, test_dir_name, .{ .allow_directory = true, .mode = .read_only }); - handle.close(io); + defer handle.close(io); + + // Reading from the handle should fail + const expected_err = switch (native_os) { + .wasi => error.NotOpenForReading, + else => error.IsDir, + }; + var buf: [1]u8 = undefined; + try expectError(expected_err, handle.readStreaming(io, &.{&buf})); + try expectError(expected_err, handle.readPositional(io, &.{&buf}, 0)); } try expectError(error.IsDir, ctx.dir.openFile(io, test_dir_name, .{ .allow_directory = false, .mode = .read_only }));