From 9a01bcab5fb0e9084adc867b55a2f00f2483e3f0 Mon Sep 17 00:00:00 2001 From: jpirnay Date: Fri, 1 May 2026 10:19:50 +0200 Subject: [PATCH] Allow slightly unconvential header from xtcjs.app --- lib/Xtc/Xtc/XtcParser.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/Xtc/Xtc/XtcParser.cpp b/lib/Xtc/Xtc/XtcParser.cpp index 303f2251..10ba7c5d 100644 --- a/lib/Xtc/Xtc/XtcParser.cpp +++ b/lib/Xtc/Xtc/XtcParser.cpp @@ -11,6 +11,7 @@ #include #include +#include #include namespace xtc { @@ -193,10 +194,15 @@ XtcError XtcParser::readFirstPageInfo() { return XtcError::CORRUPTED_HEADER; } - // Verify the file is large enough to contain the full page table + // Verify the file is large enough to contain the full page table. + // Some encoders (e.g. xtcjs.app) place the page table at offset 0x30, overlapping + // the chapterOffset/padding tail of the documented 56-byte header. Accept any + // offset at or beyond the chapterOffset field (0x30) so long as it doesn't + // overlap fields we actually parse. + constexpr uint64_t kMinPageTableOffset = offsetof(XtcHeader, chapterOffset); const uint64_t fileSize = m_file.size64(); const uint64_t pageTableSize = static_cast(m_header.pageCount) * sizeof(PageTableEntry); - if (m_header.pageTableOffset < sizeof(XtcHeader) || m_header.pageTableOffset > fileSize || + if (m_header.pageTableOffset < kMinPageTableOffset || m_header.pageTableOffset > fileSize || pageTableSize > fileSize - m_header.pageTableOffset) { LOG_DBG("XTC", "Page table exceeds file bounds"); return XtcError::CORRUPTED_HEADER;