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