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;