Fix endless recursion in XmlCompiledTransform on mobile
authorMarek Habersack <grendel@twistedcode.net>
Thu, 10 Dec 2015 21:01:52 +0000 (22:01 +0100)
committerMarek Habersack <grendel@twistedcode.net>
Thu, 10 Dec 2015 21:01:52 +0000 (22:01 +0100)
One of the XmlCompiledTransform overloads called itself recursively,
leading to either a stack overflow or segfault

Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=36436

mcs/class/System.XML/System.Xml.Xsl/XslCompiledTransform_Mobile.cs
mcs/class/System.XML/Test/System.Xml.Xsl/XslCompiledTransformTests.cs

index 808fa1ace2823ced7f8d6f457b77a147170f417f..94dcc0285baf146428ccc8cb596d6777d8f015de 100644 (file)
@@ -121,7 +121,9 @@ namespace System.Xml.Xsl
 
                public void Transform (IXPathNavigable input, XsltArgumentList arguments, Stream results)
                {
-                       Transform (input.CreateNavigator (), arguments, results);
+                       using (var sw = new StreamWriter (results)) {
+                               Transform (input.CreateNavigator (), arguments, sw);
+                       }
                }
 
                public void Transform (IXPathNavigable input, XmlWriter results)
index aa333328d962b5cf0d7640c6500f03d266c21e83..3ed7fc3a0667034bde88251c40626829e935f05a 100644 (file)
@@ -168,5 +168,31 @@ xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-micros
                        // Returns true on .NET and False on mono 2.10.2
                        Assert.IsTrue (xslCompiledTransform.OutputSettings.Indent, "#1");
                }
+
+               [Test] // Bug 36436
+               public void TransformWithXmlDocument ()
+               {
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml (@"<ROOT/>");
+                       XmlDocument st = new XmlDocument ();
+                       st.LoadXml (@"<?xml version=""1.0"" encoding=""utf-8""?>
+<xsl:stylesheet version=""1.0"" xmlns:vy=""Vineyard.Elements""
+    xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:xlink=""http://www.w3.org/1999/xlink"" xmlns:user=""http://www.mydomain.com/mynamespace"">
+  <xsl:output method=""xml""/>
+
+  <xsl:param name=""os"" select=""ios""/>
+
+  <xsl:template match=""/ROOT"" >
+    <xsl:copy/>
+</xsl:template>
+</xsl:stylesheet>");
+                       XslCompiledTransform xsl = new XslCompiledTransform ();
+                       xsl.Load (st);
+
+                       XsltArgumentList args = new XsltArgumentList ();
+
+                       MemoryStream mstr = new MemoryStream ();
+                       xsl.Transform (doc, args, mstr);
+               }
        }
 }