summaryrefslogtreecommitdiff
path: root/libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp')
-rw-r--r--libxerces-c/tests/reader-mgr/ReaderMgrTest.cpp168
1 files changed, 168 insertions, 0 deletions
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 <xercesc/util/XMLUni.hpp>
+#include <xercesc/util/Janitor.hpp>
+#include <xercesc/util/XMLString.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
+#include <xercesc/sax/InputSource.hpp>
+#include <xercesc/framework/XMLEntityDecl.hpp>
+#include <xercesc/framework/MemoryManager.hpp>
+#include <xercesc/validators/DTD/DTDValidator.hpp>
+#include <xercesc/internal/ReaderMgr.hpp>
+
+#if defined(XERCES_NEW_IOSTREAMS)
+#include <iostream>
+#else
+#include <iostream.h>
+#endif
+
+#include <set>
+#include <memory> // unique_ptr
+#include <string>
+#include <cstddef> // size_t
+
+#undef NDEBUG
+#include <cassert>
+
+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<XMLCh, XMLStringDeleter>;
+
+// ---------------------------------------------------------------------------
+// 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<string> 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<InputSource> 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<InputSource> 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;
+}