From d1da265a2c343f388c70011c4cb90ca37932a261 Mon Sep 17 00:00:00 2001 From: NiDU-NINJA Date: Fri, 27 Feb 2026 10:40:09 +0000 Subject: [PATCH 1/2] This PR replaces the use of ftell() with platform-correct 64-bit file APIs when determining file size in avifIOCreateFileReader(). --- src/io.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/io.c b/src/io.c index e43bdb5f2e..d632d148d4 100644 --- a/src/io.c +++ b/src/io.c @@ -142,13 +142,40 @@ avifIO * avifIOCreateFileReader(const char * filename) return NULL; } - fseek(f, 0, SEEK_END); - long fileSize = ftell(f); - if (fileSize < 0) { +#if defined(_WIN32) + // Windows uses _fseeki64 / _ftelli64 for large file support + if (_fseeki64(f, 0, SEEK_END) != 0) { fclose(f); return NULL; } - fseek(f, 0, SEEK_SET); + __int64 fileSizeSigned = _ftelli64(f); + if (fileSizeSigned < 0) { + fclose(f); + return NULL; + } + if (_fseeki64(f, 0, SEEK_SET) != 0) { + fclose(f); + return NULL; + } + uint64_t fileSize = (uint64_t)fileSizeSigned; + +#else + // POSIX large file support + if (fseeko(f, 0, SEEK_END) != 0) { + fclose(f); + return NULL; + } + off_t fileSizeSigned = ftello(f); + if (fileSizeSigned < 0) { + fclose(f); + return NULL; + } + if (fseeko(f, 0, SEEK_SET) != 0) { + fclose(f); + return NULL; + } + uint64_t fileSize = (uint64_t)fileSizeSigned; +#endif avifIOFileReader * reader = (avifIOFileReader *)avifAlloc(sizeof(avifIOFileReader)); if (!reader) { @@ -159,7 +186,7 @@ avifIO * avifIOCreateFileReader(const char * filename) reader->f = f; reader->io.destroy = avifIOFileReaderDestroy; reader->io.read = avifIOFileReaderRead; - reader->io.sizeHint = (uint64_t)fileSize; + reader->io.sizeHint = fileSize; reader->io.persistent = AVIF_FALSE; if (avifRWDataRealloc(&reader->buffer, 1024) != AVIF_RESULT_OK) { avifFree(reader); From f6e890acc5f1d35a16812fed4faace5186d2fc60 Mon Sep 17 00:00:00 2001 From: NiDU-NINJA Date: Wed, 4 Mar 2026 10:39:02 +0000 Subject: [PATCH 2/2] deleted blank line --- src/io.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/io.c b/src/io.c index d632d148d4..c3f9ea2d3a 100644 --- a/src/io.c +++ b/src/io.c @@ -158,7 +158,6 @@ avifIO * avifIOCreateFileReader(const char * filename) return NULL; } uint64_t fileSize = (uint64_t)fileSizeSigned; - #else // POSIX large file support if (fseeko(f, 0, SEEK_END) != 0) {