Review comments

This commit is contained in:
jpirnay
2026-04-15 17:41:58 +02:00
parent 25e9258d39
commit 5b7ac30889
+17 -1
View File
@@ -304,8 +304,10 @@ XtcError XtcParser::readChapters() {
} }
constexpr size_t chapterSize = 96; constexpr size_t chapterSize = 96;
constexpr uint64_t kMaxChapters = 4096;
const uint64_t available = maxOffset - chapterOffset; const uint64_t available = maxOffset - chapterOffset;
const size_t chapterCount = static_cast<size_t>(available / chapterSize); const uint64_t rawCount = available / chapterSize;
const size_t chapterCount = static_cast<size_t>(rawCount > kMaxChapters ? kMaxChapters : rawCount);
if (chapterCount == 0) { if (chapterCount == 0) {
return XtcError::OK; return XtcError::OK;
} }
@@ -396,11 +398,13 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
PageInfo page; PageInfo page;
if (!readPageTableEntry(pageIndex, page)) { if (!readPageTableEntry(pageIndex, page)) {
m_lastError = XtcError::READ_ERROR; m_lastError = XtcError::READ_ERROR;
closeFile();
return 0; return 0;
} }
if (!ensureFileOpen()) { if (!ensureFileOpen()) {
m_lastError = XtcError::FILE_NOT_FOUND; m_lastError = XtcError::FILE_NOT_FOUND;
closeFile();
return 0; return 0;
} }
@@ -408,6 +412,7 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
if (!m_file.seek64(page.offset)) { if (!m_file.seek64(page.offset)) {
LOG_DBG("XTC", "Failed to seek to page %u at offset %lu", pageIndex, page.offset); LOG_DBG("XTC", "Failed to seek to page %u at offset %lu", pageIndex, page.offset);
m_lastError = XtcError::READ_ERROR; m_lastError = XtcError::READ_ERROR;
closeFile();
return 0; return 0;
} }
@@ -417,6 +422,7 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
if (headerRead != sizeof(XtgPageHeader)) { if (headerRead != sizeof(XtgPageHeader)) {
LOG_DBG("XTC", "Failed to read page header for page %u", pageIndex); LOG_DBG("XTC", "Failed to read page header for page %u", pageIndex);
m_lastError = XtcError::READ_ERROR; m_lastError = XtcError::READ_ERROR;
closeFile();
return 0; return 0;
} }
@@ -426,6 +432,7 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
LOG_DBG("XTC", "Invalid page magic for page %u: 0x%08X (expected 0x%08X)", pageIndex, pageHeader.magic, LOG_DBG("XTC", "Invalid page magic for page %u: 0x%08X (expected 0x%08X)", pageIndex, pageHeader.magic,
expectedMagic); expectedMagic);
m_lastError = XtcError::INVALID_MAGIC; m_lastError = XtcError::INVALID_MAGIC;
closeFile();
return 0; return 0;
} }
@@ -444,6 +451,7 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
if (bufferSize < bitmapSize) { if (bufferSize < bitmapSize) {
LOG_DBG("XTC", "Buffer too small: need %u, have %u", bitmapSize, bufferSize); LOG_DBG("XTC", "Buffer too small: need %u, have %u", bitmapSize, bufferSize);
m_lastError = XtcError::MEMORY_ERROR; m_lastError = XtcError::MEMORY_ERROR;
closeFile();
return 0; return 0;
} }
@@ -452,10 +460,12 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
if (bytesRead != bitmapSize) { if (bytesRead != bitmapSize) {
LOG_DBG("XTC", "Page read error: expected %u, got %u", bitmapSize, bytesRead); LOG_DBG("XTC", "Page read error: expected %u, got %u", bitmapSize, bytesRead);
m_lastError = XtcError::READ_ERROR; m_lastError = XtcError::READ_ERROR;
closeFile();
return 0; return 0;
} }
m_lastError = XtcError::OK; m_lastError = XtcError::OK;
m_file.close();
return bytesRead; return bytesRead;
} }
@@ -472,15 +482,18 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex,
PageInfo page; PageInfo page;
if (!readPageTableEntry(pageIndex, page)) { if (!readPageTableEntry(pageIndex, page)) {
closeFile();
return XtcError::READ_ERROR; return XtcError::READ_ERROR;
} }
if (!ensureFileOpen()) { if (!ensureFileOpen()) {
closeFile();
return XtcError::FILE_NOT_FOUND; return XtcError::FILE_NOT_FOUND;
} }
// Seek to page data // Seek to page data
if (!m_file.seek64(page.offset)) { if (!m_file.seek64(page.offset)) {
closeFile();
return XtcError::READ_ERROR; return XtcError::READ_ERROR;
} }
@@ -489,6 +502,7 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex,
size_t headerRead = m_file.read(reinterpret_cast<uint8_t*>(&pageHeader), sizeof(XtgPageHeader)); size_t headerRead = m_file.read(reinterpret_cast<uint8_t*>(&pageHeader), sizeof(XtgPageHeader));
const uint32_t expectedMagic = (m_bitDepth == 2) ? XTH_MAGIC : XTG_MAGIC; const uint32_t expectedMagic = (m_bitDepth == 2) ? XTH_MAGIC : XTG_MAGIC;
if (headerRead != sizeof(XtgPageHeader) || pageHeader.magic != expectedMagic) { if (headerRead != sizeof(XtgPageHeader) || pageHeader.magic != expectedMagic) {
closeFile();
return XtcError::READ_ERROR; return XtcError::READ_ERROR;
} }
@@ -511,6 +525,7 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex,
size_t bytesRead = m_file.read(chunk.data(), toRead); size_t bytesRead = m_file.read(chunk.data(), toRead);
if (bytesRead == 0) { if (bytesRead == 0) {
closeFile();
return XtcError::READ_ERROR; return XtcError::READ_ERROR;
} }
@@ -518,6 +533,7 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex,
totalRead += bytesRead; totalRead += bytesRead;
} }
closeFile();
return XtcError::OK; return XtcError::OK;
} }