From a44d1dfbf3ddda9f104583760fe1613a1115ab0e Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Tue, 19 Sep 2023 23:48:40 +0100 Subject: [PATCH] `ResizeFile`: Fix `SetFilePointer` return type check `SetFilePointerEx` returns 0 on failure but `SetFilePointer` returns `INVALID_SET_FILE_POINTER`. --- Source/utils/file_util.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Source/utils/file_util.cpp b/Source/utils/file_util.cpp index ff9e8ba69..18e26b780 100644 --- a/Source/utils/file_util.cpp +++ b/Source/utils/file_util.cpp @@ -198,6 +198,7 @@ bool GetFileSize(const char *path, std::uintmax_t *size) return false; } *size = (static_cast(fileSizeHigh) << 32) | fileSizeLow; + ::CloseHandle(handle); return true; #else WIN32_FILE_ATTRIBUTE_DATA attr; @@ -313,6 +314,10 @@ bool ResizeFile(const char *path, std::uintmax_t size) #endif #ifdef DEVILUTIONX_WINDOWS_NO_WCHAR HANDLE file = ::CreateFileA(path, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (file == INVALID_HANDLE_VALUE) { + LogError("CreateFileA({}) failed: {}", path, ::GetLastError()); + return false; + } #else const auto pathUtf16 = ToWideChar(path); if (pathUtf16 == nullptr) { @@ -320,16 +325,26 @@ bool ResizeFile(const char *path, std::uintmax_t size) return false; } HANDLE file = ::CreateFileW(&pathUtf16[0], GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif if (file == INVALID_HANDLE_VALUE) { + LogError("CreateFileW({}) failed: {}", path, ::GetLastError()); return false; - } else if ( + } +#endif #if defined(WINVER) && WINVER <= 0x0500 && (!defined(_WIN32_WINNT) || _WIN32_WINNT == 0) - ::SetFilePointer(file, lisize, NULL, FILE_BEGIN) == 0 + if (::SetFilePointer(file, lisize, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { + LogError("SetFilePointer(file, {}, NULL, FILE_BEGIN) failed: {}", lisize, ::GetLastError()); + ::CloseHandle(file); + return false; + } #else - ::SetFilePointerEx(file, lisize, NULL, FILE_BEGIN) == 0 + if (::SetFilePointerEx(file, lisize, NULL, FILE_BEGIN) == 0) { + LogError("SetFilePointerEx(file, {}, NULL, FILE_BEGIN) failed: {}", size, ::GetLastError()); + ::CloseHandle(file); + return false; + } #endif - || ::SetEndOfFile(file) == 0) { + if (::SetEndOfFile(file) == 0) { + LogError("SetEndOfFile failed: {}", ::GetLastError()); ::CloseHandle(file); return false; }