diff --git a/core/os/file_windows.odin b/core/os/file_windows.odin index 8019b0440..91d206d2e 100644 --- a/core/os/file_windows.odin +++ b/core/os/file_windows.odin @@ -162,7 +162,8 @@ read :: proc(fd: Handle, data: []byte) -> (int, Errno) { total_read: int length := len(data) - to_read := min(win32.DWORD(length), MAX_RW) + // NOTE(Jeroen): `length` can't be casted to win32.DWORD here because it'll overflow if > 4 GiB and return 0 if exactly that. + to_read := min(i64(length), MAX_RW) e: win32.BOOL if is_console { @@ -172,7 +173,8 @@ read :: proc(fd: Handle, data: []byte) -> (int, Errno) { return int(total_read), err } } else { - e = win32.ReadFile(handle, &data[total_read], to_read, &single_read_length, nil) + // NOTE(Jeroen): So we cast it here *after* we've ensured that `to_read` is at most MAX_RW (1 GiB) + e = win32.ReadFile(handle, &data[total_read], win32.DWORD(to_read), &single_read_length, nil) } if single_read_length <= 0 || !e { err := Errno(win32.GetLastError())