diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp index 718f4d7..a629707 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp @@ -214,10 +214,6 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() { return false; } - XML_SetUserData(parser, this); - XML_SetElementHandler(parser, startElement, endElement); - XML_SetCharacterDataHandler(parser, characterData); - FILE* file = fopen(filepath, "r"); if (!file) { Serial.printf("[%lu] [EHP] Couldn't open file %s\n", millis(), filepath); @@ -225,10 +221,17 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() { return false; } + XML_SetUserData(parser, this); + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, characterData); + do { void* const buf = XML_GetBuffer(parser, 1024); if (!buf) { Serial.printf("[%lu] [EHP] Couldn't allocate memory for buffer\n", millis()); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); fclose(file); return false; @@ -238,6 +241,9 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() { if (ferror(file)) { Serial.printf("[%lu] [EHP] File read error\n", millis()); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); fclose(file); return false; @@ -248,12 +254,18 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() { if (XML_ParseBuffer(parser, static_cast(len), done) == XML_STATUS_ERROR) { Serial.printf("[%lu] [EHP] Parse error at line %lu:\n%s\n", millis(), XML_GetCurrentLineNumber(parser), XML_ErrorString(XML_GetErrorCode(parser))); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); fclose(file); return false; } } while (!done); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); fclose(file); diff --git a/lib/Epub/Epub/parsers/ContainerParser.cpp b/lib/Epub/Epub/parsers/ContainerParser.cpp index db126f2..da3a7b1 100644 --- a/lib/Epub/Epub/parsers/ContainerParser.cpp +++ b/lib/Epub/Epub/parsers/ContainerParser.cpp @@ -16,6 +16,8 @@ bool ContainerParser::setup() { ContainerParser::~ContainerParser() { if (parser) { + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks XML_ParserFree(parser); parser = nullptr; } diff --git a/lib/Epub/Epub/parsers/ContentOpfParser.cpp b/lib/Epub/Epub/parsers/ContentOpfParser.cpp index 5aa7303..4d3d776 100644 --- a/lib/Epub/Epub/parsers/ContentOpfParser.cpp +++ b/lib/Epub/Epub/parsers/ContentOpfParser.cpp @@ -22,6 +22,9 @@ bool ContentOpfParser::setup() { ContentOpfParser::~ContentOpfParser() { if (parser) { + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); parser = nullptr; } @@ -40,6 +43,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) { if (!buf) { Serial.printf("[%lu] [COF] Couldn't allocate memory for buffer\n", millis()); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); parser = nullptr; return 0; @@ -51,6 +57,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) { if (XML_ParseBuffer(parser, static_cast(toRead), remainingSize == toRead) == XML_STATUS_ERROR) { Serial.printf("[%lu] [COF] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser), XML_ErrorString(XML_GetErrorCode(parser))); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); parser = nullptr; return 0; diff --git a/lib/Epub/Epub/parsers/TocNcxParser.cpp b/lib/Epub/Epub/parsers/TocNcxParser.cpp index 0a613f3..f470055 100644 --- a/lib/Epub/Epub/parsers/TocNcxParser.cpp +++ b/lib/Epub/Epub/parsers/TocNcxParser.cpp @@ -18,6 +18,9 @@ bool TocNcxParser::setup() { TocNcxParser::~TocNcxParser() { if (parser) { + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); XML_ParserFree(parser); parser = nullptr; } @@ -35,6 +38,11 @@ size_t TocNcxParser::write(const uint8_t* buffer, const size_t size) { void* const buf = XML_GetBuffer(parser, 1024); if (!buf) { Serial.printf("[%lu] [TOC] Couldn't allocate memory for buffer\n", millis()); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); + XML_ParserFree(parser); + parser = nullptr; return 0; } @@ -44,6 +52,11 @@ size_t TocNcxParser::write(const uint8_t* buffer, const size_t size) { if (XML_ParseBuffer(parser, static_cast(toRead), remainingSize == toRead) == XML_STATUS_ERROR) { Serial.printf("[%lu] [TOC] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser), XML_ErrorString(XML_GetErrorCode(parser))); + XML_StopParser(parser, XML_FALSE); // Stop any pending processing + XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks + XML_SetCharacterDataHandler(parser, nullptr); + XML_ParserFree(parser); + parser = nullptr; return 0; }