From cb58116270f26557cbc37082d26a2b4b6ecd421b Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Wed, 15 Oct 2025 17:40:33 +0200 Subject: [PATCH] Fixes lseek for big files on Windows It was broken in ef69c37f66, before that we were using _lseeki64. Fixes #8459 --- source/graphics/MapIO.cpp | 6 ++++++ source/lib/file/io/io.cpp | 5 +++++ source/lib/sysdep/os/win/wposix/wfilesystem.h | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/graphics/MapIO.cpp b/source/graphics/MapIO.cpp index d050f1ccbe..8496687cc6 100644 --- a/source/graphics/MapIO.cpp +++ b/source/graphics/MapIO.cpp @@ -56,8 +56,14 @@ Status LoadHeightmapImageOs(const OsPath& filepath, std::vector& heightmap) File file; RETURN_STATUS_IF_ERR(file.Open(OsString(filepath), O_RDONLY)); +#if OS_WIN + // sizeof(long) == 4 on Windows so we can't use lseek. + size_t fileSize = _lseeki64(file.Descriptor(), 0, SEEK_END); + _lseeki64(file.Descriptor(), 0, SEEK_SET); +#else size_t fileSize = lseek(file.Descriptor(), 0, SEEK_END); lseek(file.Descriptor(), 0, SEEK_SET); +#endif std::shared_ptr fileData; RETURN_STATUS_IF_ERR(AllocateAligned(fileData, fileSize, maxSectorSize)); diff --git a/source/lib/file/io/io.cpp b/source/lib/file/io/io.cpp index 542d9f6940..e74085f5a1 100644 --- a/source/lib/file/io/io.cpp +++ b/source/lib/file/io/io.cpp @@ -51,7 +51,12 @@ Status Issue(aiocb& cb, [[maybe_unused]] size_t queueDepth) else #endif { +#if OS_WIN + // sizeof(long) == 4 on Windows so we can't use lseek. + ENSURE(_lseeki64(cb.aio_fildes, cb.aio_offset, SEEK_SET) == cb.aio_offset); +#else ENSURE(lseek(cb.aio_fildes, cb.aio_offset, SEEK_SET) == cb.aio_offset); +#endif void* buf = (void*)cb.aio_buf; // cast from volatile void* const ssize_t bytesTransferred = (cb.aio_lio_opcode == LIO_WRITE)? write(cb.aio_fildes, buf, cb.aio_nbytes) : read(cb.aio_fildes, buf, cb.aio_nbytes); diff --git a/source/lib/sysdep/os/win/wposix/wfilesystem.h b/source/lib/sysdep/os/win/wposix/wfilesystem.h index 741800f6f6..3f1c5611c6 100644 --- a/source/lib/sysdep/os/win/wposix/wfilesystem.h +++ b/source/lib/sysdep/os/win/wposix/wfilesystem.h @@ -53,6 +53,6 @@ typedef unsigned int mode_t; // defined by MinGW but not VC #define S_ISREG(m) (m & S_IFREG) -#include // read, write, lseek +#include // read, write #endif // #ifndef INCLUDED_WFILESYSTEM