Переглянути джерело

[std] check closing tags when parsing XML

closes #7689
Simon Krajewski 6 роки тому
батько
коміт
0593941921
2 змінених файлів з 31 додано та 0 видалено
  1. 6 0
      std/haxe/xml/Parser.hx
  2. 25 0
      tests/unit/src/unit/TestXML.hx

+ 6 - 0
std/haxe/xml/Parser.hx

@@ -338,6 +338,9 @@ class Parser
 							throw new XmlParserException("Expected node name", str, p);
 
 						var v = str.substr(start,p - start);
+						if (parent == null || parent.nodeType != Element) {
+							throw new XmlParserException('Unexpected </$v>, tag is not open', str, p);
+						}
 						if (v != parent.nodeName)
 							throw new XmlParserException("Expected </" +parent.nodeName + ">", str, p);
 
@@ -428,6 +431,9 @@ class Parser
 
 		if (state == S.PCDATA)
 		{
+			if (parent.nodeType == Element) {
+				throw new XmlParserException("Unclosed node <" + parent.nodeName + ">", str, p);
+			}
 			if (p != start || nsubs == 0) {
 				buf.addSub(str, start, p-start);
 				addChild(Xml.createPCData(buf.toString()));

+ 25 - 0
tests/unit/src/unit/TestXML.hx

@@ -1,5 +1,7 @@
 package unit;
 
+import haxe.xml.Parser.XmlParserException;
+
 class TestXML extends Test {
 
 	function checkExc( x : Xml, ?pos ) {
@@ -235,4 +237,27 @@ class TestXML extends Test {
 		var string:String = "<Text><![CDATA[Some text ]]></Text>";
 		eq(string, Xml.parse(string).toString());
 	}
+
+	function testNicolas() {
+		try {
+			haxe.xml.Parser.parse("<flow>x");
+			t(false);
+		} catch(exc:XmlParserException) {
+			t(exc.message.indexOf("Unclosed node <flow>") != -1);
+		}
+
+		try {
+			var xml="<f><f/></f></f>";
+			haxe.xml.Parser.parse(xml);
+		} catch(exc:XmlParserException) {
+			t(exc.message.indexOf("Unexpected </f>, tag is not open") != -1);
+		}
+
+		try {
+			haxe.xml.Parser.parse("<f><f></f>");
+			t(false);
+		} catch(exc:XmlParserException) {
+			t(exc.message.indexOf("Unclosed node <f>") != -1);
+		}
+	}
 }