From 700d7b442bf1c5d8bfafd985cb5306c3b053c52c Mon Sep 17 00:00:00 2001 From: jpirnay Date: Thu, 23 Apr 2026 09:39:58 +0200 Subject: [PATCH] fix: Erroneous navigation with long filenames in footnote links (#1723) --- lib/Epub/Epub/FootnoteEntry.h | 7 +++++-- lib/Epub/Epub/Section.cpp | 2 +- .../Epub/parsers/ChapterHtmlSlimParser.cpp | 18 +++++++++--------- lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h | 3 +-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/Epub/Epub/FootnoteEntry.h b/lib/Epub/Epub/FootnoteEntry.h index 8023df42..6034a6a5 100644 --- a/lib/Epub/Epub/FootnoteEntry.h +++ b/lib/Epub/Epub/FootnoteEntry.h @@ -2,9 +2,12 @@ #include +#define FOOTNOTE_NUMBER_LEN 32 +#define FOOTNOTE_HREF_LEN 96 + struct FootnoteEntry { - char number[24]; - char href[64]; + char number[FOOTNOTE_NUMBER_LEN]; + char href[FOOTNOTE_HREF_LEN]; FootnoteEntry() { number[0] = '\0'; diff --git a/lib/Epub/Epub/Section.cpp b/lib/Epub/Epub/Section.cpp index 0bce47e2..8a157bce 100644 --- a/lib/Epub/Epub/Section.cpp +++ b/lib/Epub/Epub/Section.cpp @@ -12,7 +12,7 @@ #include "parsers/ChapterHtmlSlimParser.h" namespace { -constexpr uint8_t SECTION_FILE_VERSION = 21; +constexpr uint8_t SECTION_FILE_VERSION = 22; constexpr uint32_t HEADER_SIZE = sizeof(uint8_t) + // SECTION_FILE_VERSION sizeof(int) + // fontId sizeof(float) + // lineCompression diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp index 8f520fae..4c92e398 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp @@ -742,9 +742,9 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char* } self->insideFootnoteLink = true; self->footnoteLinkDepth = self->depth; - strncpy(self->currentFootnoteLinkHref, href, sizeof(self->currentFootnoteLinkHref) - 1); - self->currentFootnoteLinkHref[sizeof(self->currentFootnoteLinkHref) - 1] = '\0'; - self->currentFootnoteLinkText[0] = '\0'; + strncpy(self->currentFootnote.href, href, sizeof(self->currentFootnote.href) - 1); + self->currentFootnote.href[sizeof(self->currentFootnote.href) - 1] = '\0'; + self->currentFootnote.number[0] = '\0'; self->currentFootnoteLinkTextLen = 0; // Apply underline style to visually indicate the link @@ -985,11 +985,11 @@ void XMLCALL ChapterHtmlSlimParser::characterData(void* userData, const XML_Char } // Extract footnote link text - for (int i = start; (self->currentFootnoteLinkTextLen < sizeof(self->currentFootnoteLinkText) - 1) && (i <= end); + for (int i = start; (self->currentFootnoteLinkTextLen < sizeof(self->currentFootnote.number) - 1) && (i <= end); ++i) { - self->currentFootnoteLinkText[self->currentFootnoteLinkTextLen++] = s[i]; + self->currentFootnote.number[self->currentFootnoteLinkTextLen++] = s[i]; } - self->currentFootnoteLinkText[self->currentFootnoteLinkTextLen] = '\0'; + self->currentFootnote.number[self->currentFootnoteLinkTextLen] = '\0'; } for (int i = 0; i < len; i++) { @@ -1220,11 +1220,11 @@ void XMLCALL ChapterHtmlSlimParser::endElement(void* userData, const XML_Char* n // Closing a footnote link — create entry from collected text and href if (self->insideFootnoteLink && self->depth == self->footnoteLinkDepth) { - if (self->currentFootnoteLinkText[0] != '\0' && self->currentFootnoteLinkHref[0] != '\0') { + if (self->currentFootnote.number[0] != '\0' && self->currentFootnote.href[0] != '\0') { FootnoteEntry entry; - strncpy(entry.number, self->currentFootnoteLinkText, sizeof(entry.number) - 1); + strncpy(entry.number, self->currentFootnote.number, sizeof(entry.number) - 1); entry.number[sizeof(entry.number) - 1] = '\0'; - strncpy(entry.href, self->currentFootnoteLinkHref, sizeof(entry.href) - 1); + strncpy(entry.href, self->currentFootnote.href, sizeof(entry.href) - 1); entry.href[sizeof(entry.href) - 1] = '\0'; int wordIndex = self->wordsExtractedInBlock + (self->currentTextBlock ? static_cast(self->currentTextBlock->size()) : 0); diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h index 8d189f43..44605025 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h @@ -113,9 +113,8 @@ class ChapterHtmlSlimParser { // Footnote link tracking bool insideFootnoteLink = false; int footnoteLinkDepth = -1; - char currentFootnoteLinkText[24] = {}; + FootnoteEntry currentFootnote = {}; int currentFootnoteLinkTextLen = 0; - char currentFootnoteLinkHref[64] = {}; std::vector> pendingFootnotes; // int wordsExtractedInBlock = 0;