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{...@@ -605,6 +605,7 @@ pub const ReadFileError = error{
605 /// Known to be possible when:605 /// Known to be possible when:
606 /// - Unable to read from disconnected virtual com port (Windows)606 /// - Unable to read from disconnected virtual com port (Windows)
607 AccessDenied,607 AccessDenied,
608 NotOpenForReading,
608 Unexpected,609 Unexpected,
609};610};
610611
...@@ -638,6 +639,7 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64) ReadFileError!usiz...@@ -638,6 +639,7 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64) ReadFileError!usiz
638 .NETNAME_DELETED => return error.ConnectionResetByPeer,639 .NETNAME_DELETED => return error.ConnectionResetByPeer,
639 .LOCK_VIOLATION => return error.LockViolation,640 .LOCK_VIOLATION => return error.LockViolation,
640 .ACCESS_DENIED => return error.AccessDenied,641 .ACCESS_DENIED => return error.AccessDenied,
642 .INVALID_HANDLE => return error.NotOpenForReading,
641 else => |err| return unexpectedError(err),643 else => |err| return unexpectedError(err),
642 }644 }
643 }645 }
...@@ -1152,7 +1154,10 @@ pub fn GetStdHandle(handle_id: DWORD) GetStdHandleError!HANDLE {...@@ -1152,7 +1154,10 @@ pub fn GetStdHandle(handle_id: DWORD) GetStdHandleError!HANDLE {
1152 return handle;1154 return handle;
1153}1155}
11541156
1155pub const SetFilePointerError = error{Unexpected};1157pub const SetFilePointerError = error{
1158 Unseekable,
1159 Unexpected,
1160};
11561161
1157/// The SetFilePointerEx function with the `dwMoveMethod` parameter set to `FILE_BEGIN`.1162/// The SetFilePointerEx function with the `dwMoveMethod` parameter set to `FILE_BEGIN`.
1158pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!void {1163pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!void {
...@@ -1162,6 +1167,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v...@@ -1162,6 +1167,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
1162 const ipos = @as(LARGE_INTEGER, @bitCast(offset));1167 const ipos = @as(LARGE_INTEGER, @bitCast(offset));
1163 if (kernel32.SetFilePointerEx(handle, ipos, null, FILE_BEGIN) == 0) {1168 if (kernel32.SetFilePointerEx(handle, ipos, null, FILE_BEGIN) == 0) {
1164 switch (GetLastError()) {1169 switch (GetLastError()) {
1170 .INVALID_FUNCTION => return error.Unseekable,
1171 .NEGATIVE_SEEK => return error.Unseekable,
1165 .INVALID_PARAMETER => unreachable,1172 .INVALID_PARAMETER => unreachable,
1166 .INVALID_HANDLE => unreachable,1173 .INVALID_HANDLE => unreachable,
1167 else => |err| return unexpectedError(err),1174 else => |err| return unexpectedError(err),
...@@ -1173,6 +1180,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v...@@ -1173,6 +1180,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
1173pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError!void {1180pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError!void {
1174 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_CURRENT) == 0) {1181 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_CURRENT) == 0) {
1175 switch (GetLastError()) {1182 switch (GetLastError()) {
1183 .INVALID_FUNCTION => return error.Unseekable,
1184 .NEGATIVE_SEEK => return error.Unseekable,
1176 .INVALID_PARAMETER => unreachable,1185 .INVALID_PARAMETER => unreachable,
1177 .INVALID_HANDLE => unreachable,1186 .INVALID_HANDLE => unreachable,
1178 else => |err| return unexpectedError(err),1187 else => |err| return unexpectedError(err),
...@@ -1184,6 +1193,8 @@ pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError...@@ -1184,6 +1193,8 @@ pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError
1184pub fn SetFilePointerEx_END(handle: HANDLE, offset: i64) SetFilePointerError!void {1193pub fn SetFilePointerEx_END(handle: HANDLE, offset: i64) SetFilePointerError!void {
1185 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_END) == 0) {1194 if (kernel32.SetFilePointerEx(handle, offset, null, FILE_END) == 0) {
1186 switch (GetLastError()) {1195 switch (GetLastError()) {
1196 .INVALID_FUNCTION => return error.Unseekable,
1197 .NEGATIVE_SEEK => return error.Unseekable,
1187 .INVALID_PARAMETER => unreachable,1198 .INVALID_PARAMETER => unreachable,
1188 .INVALID_HANDLE => unreachable,1199 .INVALID_HANDLE => unreachable,
1189 else => |err| return unexpectedError(err),1200 else => |err| return unexpectedError(err),
...@@ -1196,6 +1207,8 @@ pub fn SetFilePointerEx_CURRENT_get(handle: HANDLE) SetFilePointerError!u64 {...@@ -1196,6 +1207,8 @@ pub fn SetFilePointerEx_CURRENT_get(handle: HANDLE) SetFilePointerError!u64 {
1196 var result: LARGE_INTEGER = undefined;1207 var result: LARGE_INTEGER = undefined;
1197 if (kernel32.SetFilePointerEx(handle, 0, &result, FILE_CURRENT) == 0) {1208 if (kernel32.SetFilePointerEx(handle, 0, &result, FILE_CURRENT) == 0) {
1198 switch (GetLastError()) {1209 switch (GetLastError()) {
1210 .INVALID_FUNCTION => return error.Unseekable,
1211 .NEGATIVE_SEEK => return error.Unseekable,
1199 .INVALID_PARAMETER => unreachable,1212 .INVALID_PARAMETER => unreachable,
1200 .INVALID_HANDLE => unreachable,1213 .INVALID_HANDLE => unreachable,
1201 else => |err| return unexpectedError(err),1214 else => |err| return unexpectedError(err),