diff --git a/src/Base/Parameter.cpp b/src/Base/Parameter.cpp index 110b8fc462..ef5e17e664 100644 --- a/src/Base/Parameter.cpp +++ b/src/Base/Parameter.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -1859,6 +1860,17 @@ int ParameterManager::LoadDocument(const char* sFileName) } } +class NoOpEntityResolver: public XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver +{ +public: + InputSource* resolveEntity(const XMLCh* const publicId, const XMLCh* const systemId) override + { + (void)publicId; + (void)systemId; + return nullptr; // Block all external entity resolution + } +}; + int ParameterManager::LoadDocument(const XERCES_CPP_NAMESPACE_QUALIFIER InputSource& inputSource) { // @@ -1866,49 +1878,47 @@ int ParameterManager::LoadDocument(const XERCES_CPP_NAMESPACE_QUALIFIER InputSou // The parser will call back to methods of the ErrorHandler if it // discovers errors during the course of parsing the XML document. // - auto parser = new XercesDOMParser; + auto parser = std::make_unique(); + auto entityBlocker = std::make_unique(); parser->setValidationScheme(gValScheme); parser->setDoNamespaces(gDoNamespaces); parser->setDoSchema(gDoSchema); parser->setValidationSchemaFullChecking(gSchemaFullChecking); parser->setCreateEntityReferenceNodes(gDoCreate); parser->setDisableDefaultEntityResolution(true); + parser->setEntityResolver(entityBlocker.get()); - auto errReporter = new DOMTreeErrorReporter(); - parser->setErrorHandler(errReporter); + auto errReporter = std::make_unique(); + parser->setErrorHandler(errReporter.get()); // // Parse the XML file, catching any XML exceptions that might propagate // out of it. // - bool errorsOccured = false; + bool errorsOccurred = false; try { parser->parse(inputSource); } catch (const XMLException& e) { std::cerr << "An error occurred during parsing\n Message: " << StrX(e.getMessage()) - << std::endl; - errorsOccured = true; + << "\n"; + errorsOccurred = true; } catch (const DOMException& e) { std::cerr << "A DOM error occurred during parsing\n DOMException code: " << e.code - << std::endl; - errorsOccured = true; + << "\n"; + errorsOccurred = true; } catch (...) { - std::cerr << "An error occurred during parsing\n " << std::endl; - errorsOccured = true; + std::cerr << "An error occurred during parsing\n " << "\n"; + errorsOccurred = true; } - if (errorsOccured) { - delete parser; - delete errReporter; + if (errorsOccurred) { return 0; } _pDocument = parser->adoptDocument(); - delete parser; - delete errReporter; if (!_pDocument) { throw XMLBaseException("Malformed Parameter document: Invalid document"); diff --git a/src/Base/PreCompiled.h b/src/Base/PreCompiled.h index 5f61efe467..dd7d0a2182 100644 --- a/src/Base/PreCompiled.h +++ b/src/Base/PreCompiled.h @@ -104,6 +104,7 @@ #include #include #include +#include #include #include #include