From 7d43c876a4517e23a31b7364f4522868ac1401df Mon Sep 17 00:00:00 2001 From: jpirnay Date: Wed, 25 Mar 2026 17:35:19 +0100 Subject: [PATCH 1/2] Remove 2GB limit for XTC files --- lib/Xtc/Xtc/XtcParser.cpp | 25 +++++++++++++++++++++---- lib/Xtc/Xtc/XtcTypes.h | 6 +++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/Xtc/Xtc/XtcParser.cpp b/lib/Xtc/Xtc/XtcParser.cpp index 12e8a61d..5af11e61 100644 --- a/lib/Xtc/Xtc/XtcParser.cpp +++ b/lib/Xtc/Xtc/XtcParser.cpp @@ -12,9 +12,25 @@ #include #include +#include namespace xtc { +namespace { + +bool canSeekToOffset(const uint64_t offset) { + return offset <= static_cast(std::numeric_limits::max()); +} + +bool seekToOffset(FsFile& file, const uint64_t offset) { + if (!canSeekToOffset(offset)) { + return false; + } + return file.seek(static_cast(offset)); +} + +} // namespace + XtcParser::XtcParser() : m_isOpen(false), m_defaultWidth(DISPLAY_WIDTH), @@ -186,7 +202,7 @@ XtcError XtcParser::readPageTable() { return XtcError::READ_ERROR; } - m_pageTable[i].offset = static_cast(entry.dataOffset); + m_pageTable[i].offset = entry.dataOffset; m_pageTable[i].size = entry.dataSize; m_pageTable[i].width = entry.width; m_pageTable[i].height = entry.height; @@ -331,8 +347,8 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz const PageInfo& page = m_pageTable[pageIndex]; // Seek to page data - if (!m_file.seek(page.offset)) { - LOG_DBG("XTC", "Failed to seek to page %u at offset %lu", pageIndex, page.offset); + if (!seekToOffset(m_file, page.offset)) { + LOG_DBG("XTC", "Failed to seek to page %u at offset %llu", pageIndex, static_cast(page.offset)); m_lastError = XtcError::READ_ERROR; return 0; } @@ -399,7 +415,8 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex, const PageInfo& page = m_pageTable[pageIndex]; // Seek to page data - if (!m_file.seek(page.offset)) { + if (!seekToOffset(m_file, page.offset)) { + LOG_DBG("XTC", "Failed to seek to page %u at offset %llu", pageIndex, static_cast(page.offset)); return XtcError::READ_ERROR; } diff --git a/lib/Xtc/Xtc/XtcTypes.h b/lib/Xtc/Xtc/XtcTypes.h index 5cee691d..83dfd340 100644 --- a/lib/Xtc/Xtc/XtcTypes.h +++ b/lib/Xtc/Xtc/XtcTypes.h @@ -86,15 +86,15 @@ struct XtgPageHeader { }; #pragma pack(pop) -// Page information (internal use, optimized for memory) +// Page information (internal use) struct PageInfo { - uint32_t offset; // File offset to page data (max 4GB file size) + uint64_t offset; // File offset to page data uint32_t size; // Data size (bytes) uint16_t width; // Page width uint16_t height; // Page height uint8_t bitDepth; // 1 = XTG (1-bit), 2 = XTH (2-bit grayscale) uint8_t padding; // Alignment padding -}; // 16 bytes total +}; // 20 bytes total struct ChapterInfo { std::string name; From afe0b8222806edb1214d93c32905536178aa3f2c Mon Sep 17 00:00:00 2001 From: jpirnay Date: Wed, 25 Mar 2026 17:53:18 +0100 Subject: [PATCH 2/2] Cover remaining seeks --- lib/Xtc/Xtc/XtcParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Xtc/Xtc/XtcParser.cpp b/lib/Xtc/Xtc/XtcParser.cpp index 5af11e61..52adcc76 100644 --- a/lib/Xtc/Xtc/XtcParser.cpp +++ b/lib/Xtc/Xtc/XtcParser.cpp @@ -186,7 +186,7 @@ XtcError XtcParser::readPageTable() { } // Seek to page table - if (!m_file.seek(m_header.pageTableOffset)) { + if (!seekToOffset(m_file, m_header.pageTableOffset)) { LOG_DBG("XTC", "Failed to seek to page table at %llu", m_header.pageTableOffset); return XtcError::READ_ERROR; } @@ -272,7 +272,7 @@ XtcError XtcParser::readChapters() { return XtcError::OK; } - if (!m_file.seek(chapterOffset)) { + if (!seekToOffset(m_file, chapterOffset)) { return XtcError::READ_ERROR; }