Lee Thomason 8 lat temu
rodzic
commit
224ef775c6
1 zmienionych plików z 46 dodań i 0 usunięć
  1. 46 0
      xmltest.cpp

+ 46 - 0
xmltest.cpp

@@ -1754,6 +1754,52 @@ int main( int argc, const char ** argv )
 		}
 	}
 
+	{
+		// Crashing reported via email.
+		const char* xml =
+			"<playlist id='playlist1'>"
+				"<property name='track_name'>voice</property>"
+				"<property name='audio_track'>1</property>"
+				"<entry out = '604' producer = '4_playlist1' in = '0' />"
+				"<blank length = '1' />"
+				"<entry out = '1625' producer = '3_playlist' in = '0' />"
+				"<blank length = '2' />"
+				"<entry out = '946' producer = '2_playlist1' in = '0' />"
+				"<blank length = '1' />"
+				"<entry out = '128' producer = '1_playlist1' in = '0' />"
+			"</playlist>";
+			
+		// It's not a good idea to delete elements as you walk the
+		// list. I'm not sure this technically should work; but it's
+		// an interesting test case.
+		XMLDocument doc;
+		XMLError err = doc.Parse(xml);
+		XMLElement* playlist = doc.FirstChildElement("playlist");
+
+		XMLTest("Crash bug parsing", err, XMLError::XML_SUCCESS);
+		XMLTest("Crash bug parsing", true, playlist != 0);
+
+		tinyxml2::XMLElement* entry = playlist->FirstChildElement("entry");
+		XMLTest("Crash bug parsing", true, entry != 0);
+		while (entry) {
+			tinyxml2::XMLElement* todelete = entry;
+			entry = entry->NextSiblingElement("entry");
+			playlist->DeleteChild(todelete);
+		};
+		tinyxml2::XMLElement* blank = playlist->FirstChildElement("blank");
+		while (blank) {
+			tinyxml2::XMLElement* todelete = blank;
+			blank = blank->NextSiblingElement("blank");
+			playlist->DeleteChild(todelete);
+		};
+
+		tinyxml2::XMLPrinter printer;
+		playlist->Accept(&printer);
+		printf("%s\n", printer.CStr());
+
+		// No test; it only need to not crash.
+	}
+
     // ----------- Line Number Tracking --------------
     {
         struct TestUtil: XMLVisitor