Skip to content

Commit dd77d6e

Browse files
committed
Bugfix: Filesize > 4GiB - GetFileSize use Helpers::GetFileSize to get 64-bits instead of direct API call, which returns 32-bits only
Merge PR #316 by https://github.com/qbnu
2 parents a78d436 + bd2adc5 commit dd77d6e

File tree

6 files changed

+26
-22
lines changed

6 files changed

+26
-22
lines changed

src/JPEGView/Helpers.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,12 @@ __int64 GetFileSize(LPCTSTR sPath) {
855855
return fileSize;
856856
}
857857

858+
__int64 GetFileSize(HANDLE hFile) {
859+
__int64 fileSize = 0;
860+
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&fileSize);
861+
return fileSize;
862+
}
863+
858864
// Gets the frame index of the next frame, depending on the index of the last image (relevant if the image is a multiframe image)
859865
int GetFrameIndex(CJPEGImage* pImage, bool bNext, bool bPlayAnimation, bool & switchImage) {
860866
bool isMultiFrame = pImage != NULL && pImage->NumberOfFrames() > 1;

src/JPEGView/Helpers.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ namespace Helpers {
260260
// file size for file with path
261261
__int64 GetFileSize(LPCTSTR sPath);
262262

263+
// file size for file with handle
264+
__int64 GetFileSize(HANDLE hFile);
265+
263266
// Gets the frame index of the next frame, depending on the index of the last image (relevant if the image is a multiframe image)
264267
int GetFrameIndex(CJPEGImage* pImage, bool bNext, bool bPlayAnimation, bool & switchImage);
265268

src/JPEGView/ImageLoadThread.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ void CImageLoadThread::ProcessReadJPEGRequest(CRequest * request) {
481481
void* pBuffer = NULL;
482482
try {
483483
// Don't read too huge files
484-
unsigned int nFileSize = ::GetFileSize(hFile, NULL);
484+
long long nFileSize = Helpers::GetFileSize(hFile);
485485
if (nFileSize > MAX_JPEG_FILE_SIZE) {
486486
request->OutOfMemory = true;
487487
::CloseHandle(hFile);
@@ -595,11 +595,11 @@ void CImageLoadThread::ProcessReadWEBPRequest(CRequest * request) {
595595
}
596596
char* pBuffer = NULL;
597597
try {
598-
unsigned int nFileSize = 0;
598+
long long nFileSize = 0;
599599
unsigned int nNumBytesRead;
600600
if (!bUseCachedDecoder) {
601601
// Don't read too huge files
602-
nFileSize = ::GetFileSize(hFile, NULL);
602+
nFileSize = Helpers::GetFileSize(hFile);
603603
if (nFileSize > MAX_WEBP_FILE_SIZE) {
604604
request->OutOfMemory = true;
605605
::CloseHandle(hFile);
@@ -670,11 +670,11 @@ void CImageLoadThread::ProcessReadPNGRequest(CRequest* request) {
670670
HGLOBAL hFileBuffer = NULL;
671671
void* pBuffer = NULL;
672672
try {
673-
unsigned int nFileSize;
673+
long long nFileSize;
674674
unsigned int nNumBytesRead;
675675
if (!bUseCachedDecoder) {
676676
// Don't read too huge files
677-
nFileSize = ::GetFileSize(hFile, NULL);
677+
nFileSize = Helpers::GetFileSize(hFile);
678678
if (nFileSize > MAX_PNG_FILE_SIZE) {
679679
request->OutOfMemory = true;
680680
::CloseHandle(hFile);
@@ -766,11 +766,11 @@ void CImageLoadThread::ProcessReadJXLRequest(CRequest* request) {
766766
char* pBuffer = NULL;
767767
UINT nPrevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
768768
try {
769-
unsigned int nFileSize = 0;
769+
long long nFileSize = 0;
770770
unsigned int nNumBytesRead;
771771
if (!bUseCachedDecoder) {
772772
// Don't read too huge files
773-
nFileSize = ::GetFileSize(hFile, NULL);
773+
nFileSize = Helpers::GetFileSize(hFile);
774774
if (nFileSize > MAX_JXL_FILE_SIZE) {
775775
request->OutOfMemory = true;
776776
::CloseHandle(hFile);
@@ -839,11 +839,11 @@ void CImageLoadThread::ProcessReadAVIFRequest(CRequest* request) {
839839
char* pBuffer = NULL;
840840
UINT nPrevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
841841
try {
842-
unsigned int nFileSize = 0;
842+
long long nFileSize = 0;
843843
unsigned int nNumBytesRead;
844844
if (!bUseCachedDecoder) {
845845
// Don't read too huge files
846-
nFileSize = ::GetFileSize(hFile, NULL);
846+
nFileSize = Helpers::GetFileSize(hFile);
847847
if (nFileSize > MAX_HEIF_FILE_SIZE) {
848848
request->OutOfMemory = true;
849849
::CloseHandle(hFile);
@@ -904,10 +904,9 @@ void CImageLoadThread::ProcessReadHEIFRequest(CRequest* request) {
904904
char* pBuffer = NULL;
905905
UINT nPrevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
906906
try {
907-
unsigned int nFileSize = 0;
908907
unsigned int nNumBytesRead;
909908
// Don't read too huge files
910-
nFileSize = ::GetFileSize(hFile, NULL);
909+
long long nFileSize = Helpers::GetFileSize(hFile);
911910
if (nFileSize > MAX_HEIF_FILE_SIZE) {
912911
request->OutOfMemory = true;
913912
::CloseHandle(hFile);
@@ -967,10 +966,9 @@ void CImageLoadThread::ProcessReadQOIRequest(CRequest* request) {
967966
}
968967
char* pBuffer = NULL;
969968
try {
970-
unsigned int nFileSize = 0;
971969
unsigned int nNumBytesRead;
972970
// Don't read too huge files
973-
nFileSize = ::GetFileSize(hFile, NULL);
971+
long long nFileSize = Helpers::GetFileSize(hFile);
974972
if (nFileSize > MAX_PNG_FILE_SIZE) {
975973
request->OutOfMemory = true;
976974
::CloseHandle(hFile);

src/JPEGView/JPEGLosslessTransform.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "StdAfx.h"
22
#include "JPEGLosslessTransform.h"
3+
#include "Helpers.h"
34
#include "libjpeg-turbo\include\turbojpeg.h"
45

56
CJPEGLosslessTransform::EResult _DoTransformation(LPCTSTR sInputFile, LPCTSTR sOutputFile, tjtransform &transform);
@@ -73,7 +74,7 @@ static unsigned char* _ReadFile(LPCTSTR sFileName, unsigned int & nLengthBytes)
7374
return NULL;
7475
}
7576

76-
unsigned int nFileSize = ::GetFileSize(hFile, NULL);
77+
long long nFileSize = Helpers::GetFileSize(hFile);
7778
if (nFileSize > MAX_JPEG_FILE_SIZE) {
7879
::CloseHandle(hFile);
7980
return NULL;

src/JPEGView/PSDWrapper.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ CJPEGImage* PsdReader::ReadImage(LPCTSTR strFileName, bool& bOutOfMemory)
110110
void* transform = NULL;
111111
CJPEGImage* Image = NULL;
112112
try {
113-
unsigned int nFileSize = 0;
114-
nFileSize = ::GetFileSize(hFile, NULL);
113+
long long nFileSize = Helpers::GetFileSize(hFile);
115114
ThrowIf(nFileSize > MAX_PSD_FILE_SIZE);
116115

117116
// Skip file signature

src/JPEGView/ParameterDB.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,7 @@ CParameterDB::DBBlock* CParameterDB::LoadFromFile(const CString& sParamDBName, b
575575
}
576576

577577
// Check if file is too large
578-
__int64 nFileSize;
579-
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&nFileSize);
578+
__int64 nFileSize = Helpers::GetFileSize(hFile);
580579
if (nFileSize > MAX_DB_FILE_SIZE) {
581580
HandleErrorAndCloseHandle(errorTooLarge, sParamDBName, hFile);
582581
return NULL;
@@ -619,8 +618,7 @@ bool CParameterDB::SaveToFile(int nIndex, const CParameterDBEntry & dbEntry) {
619618
}
620619

621620
// Check header, do not overwrite unknown files or versions
622-
__int64 nFileSize;
623-
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&nFileSize);
621+
__int64 nFileSize = Helpers::GetFileSize(hFile);
624622
if (nFileSize >= sizeof(ParameterDBHeader)) {
625623
// check the header
626624
int nVersion = 0;
@@ -684,8 +682,7 @@ bool CParameterDB::SaveToFile(int nIndex, const CParameterDBEntry & dbEntry) {
684682
}
685683

686684
bool CParameterDB::ConvertVersion1To2(HANDLE hFile, const CString& sFileName) {
687-
__int64 nFileSize;
688-
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&nFileSize);
685+
__int64 nFileSize = Helpers::GetFileSize(hFile);
689686
if (nFileSize > MAX_DB_FILE_SIZE) {
690687
HandleErrorAndCloseHandle(errorTooLarge, sFileName, hFile);
691688
return false;

0 commit comments

Comments
 (0)