DataTabe.ReadXmlSchema now handles non Schema base element. Fixes #22501.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Mon, 13 Oct 2014 19:58:08 +0000 (15:58 -0400)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Mon, 13 Oct 2014 20:15:23 +0000 (16:15 -0400)
mcs/class/System.Data/System.Data/DataTable.cs

index 36036b2e2aea76e36232ccb1441224e335a143fd..19f5896bf326b344c2f5f1278fbfa4f63a4531ec 100644 (file)
@@ -1998,12 +1998,41 @@ namespace System.Data {
                        }\r
                }\r
 \r
+               private bool ReadSchemaElement (XmlReader reader)\r
+               {\r
+                       var insideElement = false;\r
+                       reader.MoveToElement ();\r
+                       while (reader.Read ())\r
+                       {\r
+                               if (reader.NodeType == XmlNodeType.Element || reader.NodeType == XmlNodeType.EndElement)\r
+                               {\r
+                                       if (reader.NamespaceURI != XmlSchema.Namespace)\r
+                                       {\r
+                                               if (reader.LocalName == "schema" || insideElement)\r
+                                                       throw new ArgumentException ("The schema namespace is invalid. Please use this one instead: " + XmlSchema.Namespace);\r
+\r
+                                               insideElement = true;\r
+                                               reader.MoveToElement ();\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                       }\r
+                       return false;\r
+               }\r
+\r
                public void ReadXmlSchema (XmlReader reader)\r
                {\r
                        if (this.Columns.Count > 0)\r
                                return;\r
 \r
                        DataSet ds = new DataSet ();\r
+\r
+                       if (reader.ReadState == ReadState.Initial && !ReadSchemaElement (reader))\r
+                               return;\r
+\r
                        new XmlSchemaDataImporter (ds, reader, false).Process ();\r
                        DataTable target = null;\r
                        if (TableName == String.Empty) {\r