diff --git a/cdoc/CDoc1Reader.cpp b/cdoc/CDoc1Reader.cpp index cb724f0d..321d7164 100644 --- a/cdoc/CDoc1Reader.cpp +++ b/cdoc/CDoc1Reader.cpp @@ -357,6 +357,8 @@ CDoc1Reader::CDoc1Reader(libcdoc::DataSource *src, bool delete_on_close) } } } + if(reader.hasError()) + setLastError("Cannot parse container"); } CDoc1Reader::~CDoc1Reader() noexcept diff --git a/cdoc/XmlReader.cpp b/cdoc/XmlReader.cpp index 1fc8a382..db84d17b 100644 --- a/cdoc/XmlReader.cpp +++ b/cdoc/XmlReader.cpp @@ -80,12 +80,19 @@ bool XMLReader::isElement(const char *elem) const bool XMLReader::read() { if (!d) return false; - if (xmlTextReaderRead(d) != 1) + if (int result = xmlTextReaderRead(d); result != 1) + { + error = result < 0; + if (error) + LOG_ERROR("XMLReader: failed to parse document"); return false; + } switch(xmlTextReaderNodeType(d)) { case XML_READER_TYPE_DOCUMENT_TYPE: case XML_READER_TYPE_ENTITY_REFERENCE: + error = true; + LOG_ERROR("XMLReader: document type declaration or entity reference is not allowed"); return false; default: return true; diff --git a/cdoc/XmlReader.h b/cdoc/XmlReader.h index cccbe488..c04532f0 100644 --- a/cdoc/XmlReader.h +++ b/cdoc/XmlReader.h @@ -40,9 +40,11 @@ class XMLReader bool read(); std::vector readBase64(); std::string readText(); + bool hasError() const { return error; } private: _xmlTextReader *d; + bool error = false; }; } // namespace libcdoc