Thoroughly deinitialise expat parsers before freeing them
This commit is contained in:
parent
6fe28da41b
commit
bf9d60208d
@ -214,10 +214,6 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
XML_SetUserData(parser, this);
|
|
||||||
XML_SetElementHandler(parser, startElement, endElement);
|
|
||||||
XML_SetCharacterDataHandler(parser, characterData);
|
|
||||||
|
|
||||||
FILE* file = fopen(filepath, "r");
|
FILE* file = fopen(filepath, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
Serial.printf("[%lu] [EHP] Couldn't open file %s\n", millis(), filepath);
|
Serial.printf("[%lu] [EHP] Couldn't open file %s\n", millis(), filepath);
|
||||||
@ -225,10 +221,17 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XML_SetUserData(parser, this);
|
||||||
|
XML_SetElementHandler(parser, startElement, endElement);
|
||||||
|
XML_SetCharacterDataHandler(parser, characterData);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
void* const buf = XML_GetBuffer(parser, 1024);
|
void* const buf = XML_GetBuffer(parser, 1024);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
Serial.printf("[%lu] [EHP] Couldn't allocate memory for buffer\n", millis());
|
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);
|
XML_ParserFree(parser);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return false;
|
return false;
|
||||||
@ -238,6 +241,9 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
|
|||||||
|
|
||||||
if (ferror(file)) {
|
if (ferror(file)) {
|
||||||
Serial.printf("[%lu] [EHP] File read error\n", millis());
|
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);
|
XML_ParserFree(parser);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return false;
|
return false;
|
||||||
@ -248,12 +254,18 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
|
|||||||
if (XML_ParseBuffer(parser, static_cast<int>(len), done) == XML_STATUS_ERROR) {
|
if (XML_ParseBuffer(parser, static_cast<int>(len), done) == XML_STATUS_ERROR) {
|
||||||
Serial.printf("[%lu] [EHP] Parse error at line %lu:\n%s\n", millis(), XML_GetCurrentLineNumber(parser),
|
Serial.printf("[%lu] [EHP] Parse error at line %lu:\n%s\n", millis(), XML_GetCurrentLineNumber(parser),
|
||||||
XML_ErrorString(XML_GetErrorCode(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);
|
XML_ParserFree(parser);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} while (!done);
|
} 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);
|
XML_ParserFree(parser);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,8 @@ bool ContainerParser::setup() {
|
|||||||
|
|
||||||
ContainerParser::~ContainerParser() {
|
ContainerParser::~ContainerParser() {
|
||||||
if (parser) {
|
if (parser) {
|
||||||
|
XML_StopParser(parser, XML_FALSE); // Stop any pending processing
|
||||||
|
XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
|
||||||
XML_ParserFree(parser);
|
XML_ParserFree(parser);
|
||||||
parser = nullptr;
|
parser = nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,9 @@ bool ContentOpfParser::setup() {
|
|||||||
|
|
||||||
ContentOpfParser::~ContentOpfParser() {
|
ContentOpfParser::~ContentOpfParser() {
|
||||||
if (parser) {
|
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);
|
XML_ParserFree(parser);
|
||||||
parser = nullptr;
|
parser = nullptr;
|
||||||
}
|
}
|
||||||
@ -40,6 +43,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) {
|
|||||||
|
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
Serial.printf("[%lu] [COF] Couldn't allocate memory for buffer\n", millis());
|
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);
|
XML_ParserFree(parser);
|
||||||
parser = nullptr;
|
parser = nullptr;
|
||||||
return 0;
|
return 0;
|
||||||
@ -51,6 +57,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) {
|
|||||||
if (XML_ParseBuffer(parser, static_cast<int>(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
|
if (XML_ParseBuffer(parser, static_cast<int>(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
|
||||||
Serial.printf("[%lu] [COF] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
|
Serial.printf("[%lu] [COF] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
|
||||||
XML_ErrorString(XML_GetErrorCode(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);
|
XML_ParserFree(parser);
|
||||||
parser = nullptr;
|
parser = nullptr;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -18,6 +18,9 @@ bool TocNcxParser::setup() {
|
|||||||
|
|
||||||
TocNcxParser::~TocNcxParser() {
|
TocNcxParser::~TocNcxParser() {
|
||||||
if (parser) {
|
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);
|
XML_ParserFree(parser);
|
||||||
parser = nullptr;
|
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);
|
void* const buf = XML_GetBuffer(parser, 1024);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
Serial.printf("[%lu] [TOC] Couldn't allocate memory for buffer\n", millis());
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +52,11 @@ size_t TocNcxParser::write(const uint8_t* buffer, const size_t size) {
|
|||||||
if (XML_ParseBuffer(parser, static_cast<int>(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
|
if (XML_ParseBuffer(parser, static_cast<int>(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
|
||||||
Serial.printf("[%lu] [TOC] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
|
Serial.printf("[%lu] [TOC] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
|
||||||
XML_ErrorString(XML_GetErrorCode(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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user