@@ -605,8 +605,8 @@ BOOST_AUTO_TEST_SUITE_END()
605605BOOST_AUTO_TEST_SUITE (XMLTestSuite)
606606BOOST_AUTO_TEST_CASE (XMLBomb)
607607{
608- BOOST_CHECK_EQUAL (XMLDocument (" xml-bomb-attr.xml" ), false );
609- BOOST_CHECK_EQUAL (XMLDocument (" xml-bomb-cont.xml" ), false );
608+ BOOST_CHECK_THROW (XMLDocument (" xml-bomb-attr.xml" ), Exception );
609+ BOOST_CHECK_THROW (XMLDocument (" xml-bomb-cont.xml" ), Exception );
610610 if (std::fstream f{" xml-bomb-attr.xml" })
611611 BOOST_CHECK_THROW (XMLDocument::openStream (f), Exception);
612612 if (std::fstream f{" xml-bomb-cont.xml" })
@@ -655,6 +655,7 @@ BOOST_AUTO_TEST_CASE(XMLXXE)
655655 " ]><root>&sentinel;</root>" ,
656656 };
657657
658+ size_t payloadIndex = 0 ;
658659 for (const auto &payload : payloads) {
659660 for (bool huge : {false , true }) {
660661 std::istringstream is{std::string (payload)};
@@ -664,6 +665,21 @@ BOOST_AUTO_TEST_CASE(XMLXXE)
664665 BOOST_CHECK (!text.contains (" XXESENTINEL" ));
665666 xmlFree (raw);
666667 }
668+
669+ const auto path = (fs::temp_directory_path () /
670+ (" libdigidocpp-xxe-payload-" + std::to_string (payloadIndex++) + " .xml" )).string ();
671+ std::ofstream out{path, std::ofstream::binary};
672+ BOOST_REQUIRE (out.is_open ());
673+ out << payload;
674+ out.close ();
675+ BOOST_REQUIRE (out.good ());
676+
677+ auto doc = XMLDocument (path);
678+ xmlChar *raw = xmlNodeGetContent (doc.d );
679+ std::string_view text = raw ? (const char *)raw : " " ;
680+ BOOST_CHECK (!text.contains (" XXESENTINEL" ));
681+ xmlFree (raw);
682+ fs::remove (path);
667683 }
668684}
669685BOOST_AUTO_TEST_SUITE_END ()
0 commit comments