From ffa995524f11d3be93eb8a2b2a7755a56d8391df Mon Sep 17 00:00:00 2001
From: Jiayi <14067510+yujayee@users.noreply.github.com>
Date: Thu, 16 May 2019 17:20:22 -0700
Subject: [PATCH] Fix a bug in xsd validation during deserialization
(dotnet/corefx#37596)
* Fix a bug in xsd validation during deserialization
* Add a test
Commit migrated from https://github.com/dotnet/corefx/commit/4435d785565f192392b29890401748a6cdea4109
---
.../src/System/Xml/Core/XsdValidatingReader.cs | 4 +-
.../tests/XmlSerializer/XmlSerializerTests.cs | 71 ++++++++++++++++++++++
.../tests/SerializationTypes.cs | 18 ++++++
3 files changed, 91 insertions(+), 2 deletions(-)
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs
index 34db9fd..f539ad9 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs
@@ -1011,13 +1011,13 @@ namespace System.Xml
try
{
- if (xmlType != null)
+ if (xmlType != null && typedValue != null)
{
return xmlType.ValueConverter.ToString(typedValue);
}
else
{
- return typedValue as string;
+ return typedValue as string ?? string.Empty;
}
}
catch (InvalidCastException e)
diff --git a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
index 7c676c7..aa44cfa 100644
--- a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
+++ b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
@@ -1763,6 +1763,77 @@ string.Format(@"
Assert.StrictEqual(value.IntValue, actual.IntValue);
}
+ [Fact]
+ public static void Xml_XsdValidationAndDeserialization()
+ {
+ var xsdstring = @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+";
+ var param = "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+
+ using (var stream = new MemoryStream())
+ {
+ using (var writer = new StreamWriter(stream))
+ {
+ writer.Write(param);
+ writer.Flush();
+ stream.Position = 0;
+
+ var xmlReaderSettings = new XmlReaderSettings();
+ xmlReaderSettings.ValidationType = ValidationType.Schema;
+ xmlReaderSettings.ValidationEventHandler += (sender, args) =>
+ {
+ throw new XmlSchemaValidationException(args.Message);
+ };
+ xmlReaderSettings.Schemas.Add(null, XmlReader.Create(new StringReader(xsdstring)));
+
+ var xmlReader = XmlReader.Create(stream, xmlReaderSettings);
+
+ var overrides = new XmlAttributeOverrides();
+ var parametersXmlAttribute = new XmlAttributes { XmlType = new XmlTypeAttribute("stringParameter") };
+ overrides.Add(typeof(Parameter), parametersXmlAttribute);
+
+ var serializer = new XmlSerializer(typeof(RootClass), overrides);
+ var result=(RootClass)serializer.Deserialize(xmlReader);
+
+ Assert.Equal("SomeName", result.Parameters[0].Name);
+ Assert.Equal(string.Empty, ((Parameter)result.Parameters[0]).Value);
+ }
+ }
+ }
+
private static readonly string s_defaultNs = "http://tempuri.org/";
private static T RoundTripWithXmlMembersMapping(object requestBodyValue, string memberName, string baseline, bool skipStringCompare = false, string wrapperName = null)
{
diff --git a/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs b/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs
index 4e379eb..7e41d5c 100644
--- a/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs
+++ b/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs
@@ -1264,3 +1264,21 @@ public partial class MsgDocumentType
[System.Xml.Serialization.XmlAttribute("refs", DataType = "IDREFS")]
public string[] Refs { get; set; }
}
+
+public class RootClass
+{
+ [XmlArray]
+ public List Parameters { get; set; }
+}
+
+[XmlInclude(typeof(Parameter))]
+public class Parameter
+{
+ [XmlAttribute]
+ public string Name { get; set; }
+}
+
+public class Parameter : Parameter
+{
+ public T Value { get; set; }
+}
--
2.7.4