authorgravatar for iodizon@163.comHydroH <iodizon@163.com> 2025-05-08 16:30:33+08:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-05-09 08:57:00+02:00
log32bf1fbf46e0f5bc27e5ce260ffa8c55ab396654
tree0ee74de1660ce9c1a960241abd7a293e0f77c936
parent10bf6964edc6d1a002b0ea313e256701295ba11c

std: fix `error.Unexpected` on certain Windows file operations

Closes #23690.

1 files changed, 14 insertions(+), 1 deletions(-)

lib/std/os/windows.zig+14-1
......@@ -605,6 +605,7 @@ pub const ReadFileError = error{
605605 /// Known to be possible when:
606606 /// - Unable to read from disconnected virtual com port (Windows)
607607 AccessDenied,
608 NotOpenForReading,
608609 Unexpected,
609610};
610611
......@@ -638,6 +639,7 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64) ReadFileError!usiz
638639 .NETNAME_DELETED => return error.ConnectionResetByPeer,
639640 .LOCK_VIOLATION => return error.LockViolation,
640641 .ACCESS_DENIED => return error.AccessDenied,
642 .INVALID_HANDLE => return error.NotOpenForReading,
641643 else => |err| return unexpectedError(err),
642644 }
643645 }
......@@ -1152,7 +1154,10 @@ pub fn GetStdHandle(handle_id: DWORD) GetStdHandleError!HANDLE {
11521154 return handle;
11531155}
11541156
1155pub const SetFilePointerError = error{Unexpected};
1157pub const SetFilePointerError = error{
1158 Unseekable,
1159 Unexpected,
1160};
11561161
11571162/// The SetFilePointerEx function with the `dwMoveMethod` parameter set to `FILE_BEGIN`.
11581163pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!void {
......@@ -1162,6 +1167,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
11621167 const ipos = @as(LARGE_INTEGER, @bitCast(offset));
11631168 if (kernel32.SetFilePointerEx(handle, ipos, null, FILE_BEGIN) == 0) {
11641169 switch (GetLastError()) {
1170 .INVALID_FUNCTION => return error.Unseekable,
1171 .NEGATIVE_SEEK => return error.Unseekable,
11651172 .INVALID_PARAMETER => unreachable,
11661173 .INVALID_HANDLE => unreachable,
11671174 else => |err| return unexpectedError(err),
......@@ -1173,6 +1180,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
11731180pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError!void {
11741181 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_CURRENT) == 0) {
11751182 switch (GetLastError()) {
1183 .INVALID_FUNCTION => return error.Unseekable,
1184 .NEGATIVE_SEEK => return error.Unseekable,
11761185 .INVALID_PARAMETER => unreachable,
11771186 .INVALID_HANDLE => unreachable,
11781187 else => |err| return unexpectedError(err),
......@@ -1184,6 +1193,8 @@ pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError
11841193pub fn SetFilePointerEx_END(handle: HANDLE, offset: i64) SetFilePointerError!void {
11851194 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_END) == 0) {
11861195 switch (GetLastError()) {
1196 .INVALID_FUNCTION => return error.Unseekable,
1197 .NEGATIVE_SEEK => return error.Unseekable,
11871198 .INVALID_PARAMETER => unreachable,
11881199 .INVALID_HANDLE => unreachable,
11891200 else => |err| return unexpectedError(err),
......@@ -1196,6 +1207,8 @@ pub fn SetFilePointerEx_CURRENT_get(handle: HANDLE) SetFilePointerError!u64 {
11961207 var result: LARGE_INTEGER = undefined;
11971208 if (kernel32.SetFilePointerEx(handle, 0, &result, FILE_CURRENT) == 0) {
11981209 switch (GetLastError()) {
1210 .INVALID_FUNCTION => return error.Unseekable,
1211 .NEGATIVE_SEEK => return error.Unseekable,
11991212 .INVALID_PARAMETER => unreachable,
12001213 .INVALID_HANDLE => unreachable,
12011214 else => |err| return unexpectedError(err),