From 982a13b902e3c7989e10ca2ba6604ce6465a7253 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 1 Dec 2023 20:12:40 +0300 Subject: Add ReaderMgr test --- libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp | 168 ++++++++++++++ libxerces-c/tests/reader-mgr/buildfile | 8 + libxerces-c/tests/reader-mgr/characters.ent | 297 +++++++++++++++++++++++++ libxerces-c/tests/reader-mgr/links.ent | 24 ++ libxerces-c/tests/reader-mgr/personal.dtd | 17 ++ libxerces-c/tests/reader-mgr/testscript | 8 + 6 files changed, 522 insertions(+) create mode 100644 libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp create mode 100644 libxerces-c/tests/reader-mgr/buildfile create mode 100644 libxerces-c/tests/reader-mgr/characters.ent create mode 100644 libxerces-c/tests/reader-mgr/links.ent create mode 100644 libxerces-c/tests/reader-mgr/personal.dtd create mode 100644 libxerces-c/tests/reader-mgr/testscript (limited to 'libxerces-c') diff --git a/libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp b/libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp new file mode 100644 index 0000000..fc7e328 --- /dev/null +++ b/libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * $Id$ + * + */ + +/* + * This test verifies the fix of the CVE-2018-1311 issue (see + * https://issues.apache.org/jira/projects/XERCESC/issues/XERCESC-2188 for all + * the gory details). + */ + +// --------------------------------------------------------------------------- +// Includes +// --------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(XERCES_NEW_IOSTREAMS) +#include +#else +#include +#endif + +#include +#include // unique_ptr +#include +#include // size_t + +#undef NDEBUG +#include + +XERCES_CPP_NAMESPACE_USE + +using namespace std; + +inline XERCES_STD_QUALIFIER ostream& operator<<(XERCES_STD_QUALIFIER ostream& os, const XMLCh* xmlStr) +{ + char* transcoded = XMLString::transcode(xmlStr); + os << transcoded; + XMLString::release(&transcoded); + return os; +} + +struct XMLStringDeleter +{ + void operator() (XMLCh* p) const {if (p != nullptr) XMLString::release(&p);} +}; + +using XMLChPtr = unique_ptr; + +// --------------------------------------------------------------------------- +// Program entry point +// --------------------------------------------------------------------------- +int +main(int argc, char** argv) +{ + // Init the XML platform + try + { + XMLPlatformUtils::Initialize(); + } + catch(const XMLException& toCatch) + { + XERCES_STD_QUALIFIER cout << "Error during platform init! Message:\n" + << toCatch.getMessage() << XERCES_STD_QUALIFIER endl; + return 1; + } + + MemoryManager* const fMemoryManager = XMLPlatformUtils::fgMemoryManager; + + { + set entity_names; + ReaderMgr fReaderMgr; + + for (int i (1); i != argc; ++i) + { + string s (argv[i]); + size_t n (s.find ('=')); + + assert (n != string::npos); + + string name (s, 0, n); + + XMLChPtr sysId (XMLString::transcode(string (s, n + 1).c_str ())); + + { + XMLChPtr gDTDStr (XMLString::transcode(name.c_str ())); + bool new_entity (entity_names.emplace (move (name)).second); + + InputSource* srcUsed=0; + Janitor janSrc(srcUsed); + + XMLReader* reader = + fReaderMgr.createReader + ( + sysId.get () + , XMLUni::fgEmptyString /* pubId */ + , false /* xmlDecl */ + , XMLReader::RefFrom_NonLiteral + , XMLReader::Type_General + , XMLReader::Source_External + , srcUsed + ); + + assert (reader != nullptr); + + janSrc.reset(srcUsed); + + DTDEntityDecl* declDTD = + new (fMemoryManager) DTDEntityDecl(gDTDStr.get (), false, fMemoryManager); + + assert (fReaderMgr.pushReaderAdoptEntity(reader, declDTD) == new_entity); + } + + { + InputSource* srcUsed=0; + Janitor janSrc(srcUsed); + + XMLReader* reader = + fReaderMgr.createReader + ( + sysId.get () + , XMLUni::fgEmptyString /* pubId */ + , false /* xmlDecl */ + , XMLReader::RefFrom_NonLiteral + , XMLReader::Type_General + , XMLReader::Source_External + , srcUsed + ); + + assert (reader != nullptr); + + janSrc.reset(srcUsed); + + assert (fReaderMgr.pushReader(reader, nullptr)); + } + } + } + + // And call the termination method + XMLPlatformUtils::Terminate(); + + return 0; +} diff --git a/libxerces-c/tests/reader-mgr/buildfile b/libxerces-c/tests/reader-mgr/buildfile new file mode 100644 index 0000000..dc2405c --- /dev/null +++ b/libxerces-c/tests/reader-mgr/buildfile @@ -0,0 +1,8 @@ +# file : tests/reader-mgr/buildfile +# license : Apache License 2.0; see accompanying LICENSE file + +import libs = libxerces-c%lib{xerces-c} + +./: exe{driver} file{*.dtd *.ent} + +exe{driver}: {hxx cxx}{*} $libs testscript diff --git a/libxerces-c/tests/reader-mgr/characters.ent b/libxerces-c/tests/reader-mgr/characters.ent new file mode 100644 index 0000000..d3780e5 --- /dev/null +++ b/libxerces-c/tests/reader-mgr/characters.ent @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libxerces-c/tests/reader-mgr/links.ent b/libxerces-c/tests/reader-mgr/links.ent new file mode 100644 index 0000000..a8f9fd4 --- /dev/null +++ b/libxerces-c/tests/reader-mgr/links.ent @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libxerces-c/tests/reader-mgr/personal.dtd b/libxerces-c/tests/reader-mgr/personal.dtd new file mode 100644 index 0000000..e636266 --- /dev/null +++ b/libxerces-c/tests/reader-mgr/personal.dtd @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/libxerces-c/tests/reader-mgr/testscript b/libxerces-c/tests/reader-mgr/testscript new file mode 100644 index 0000000..09bb7cc --- /dev/null +++ b/libxerces-c/tests/reader-mgr/testscript @@ -0,0 +1,8 @@ +# file : tests/reader-mgr/testscript +# license : Apache License 2.0; see accompanying LICENSE file + +: basics +: +$* "personal=$src_base/personal.dtd" \ + "links=$src_base/links.ent" \ + "characters=$src_base/characters.ent" -- cgit v1.1