From: Christopher Watford Date: Mon, 20 May 2019 19:11:17 +0000 (-0400) Subject: Ensure JsonException is thrown parsing invalid DateTime, DateTimeOffset, and Guid... X-Git-Tag: submit/tizen/20210909.063632~11031^2~1537 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=02416b5012d13e6252a3381f35952ef97f76fed3;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Ensure JsonException is thrown parsing invalid DateTime, DateTimeOffset, and Guid dotnet/corefx#37807 (dotnet/corefx#37809) * Add tests to cover dotnet/corefx#36901 and dotnet/corefx#37807 * Ensure DateTime(Offset) and Guid throw JsonException dotnet/corefx#37807 - The original JsonValueConverterXXX code for these allowed an InvalidOperationException to be raised from Utf8JsonReader.TryGetXXX, instead of returning false so a JsonException could be thrown. Commit migrated from https://github.com/dotnet/corefx/commit/3ff5c4a6eb6315c61cfb0078245c31b59f798290 --- diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTime.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTime.cs index f15470c..9abbfa7 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTime.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTime.cs @@ -10,6 +10,12 @@ namespace System.Text.Json.Serialization.Converters { public override bool TryRead(Type valueType, ref Utf8JsonReader reader, out DateTime value) { + if (reader.TokenType != JsonTokenType.String) + { + value = default; + return false; + } + return reader.TryGetDateTime(out value); } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTimeOffset.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTimeOffset.cs index 0f9d6d3..0567bfb 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTimeOffset.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterDateTimeOffset.cs @@ -10,6 +10,12 @@ namespace System.Text.Json.Serialization.Converters { public override bool TryRead(Type valueType, ref Utf8JsonReader reader, out DateTimeOffset value) { + if (reader.TokenType != JsonTokenType.String) + { + value = default; + return false; + } + return reader.TryGetDateTimeOffset(out value); } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterGuid.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterGuid.cs index 5e5809c..c249e36 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterGuid.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterGuid.cs @@ -10,6 +10,12 @@ namespace System.Text.Json.Serialization.Converters { public override bool TryRead(Type valueType, ref Utf8JsonReader reader, out Guid value) { + if (reader.TokenType != JsonTokenType.String) + { + value = default; + return false; + } + return reader.TryGetGuid(out value); } diff --git a/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs b/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs index ae223fc..a7fe869 100644 --- a/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs +++ b/src/libraries/System.Text.Json/tests/Serialization/Value.ReadTests.cs @@ -74,6 +74,32 @@ namespace System.Text.Json.Serialization.Tests Assert.Throws(() => JsonSerializer.Parse(@"""""")); } + [Theory] + [InlineData(typeof(bool))] + [InlineData(typeof(byte))] + [InlineData(typeof(char))] + [InlineData(typeof(DateTime))] + [InlineData(typeof(DateTimeOffset))] + [InlineData(typeof(decimal))] + [InlineData(typeof(double))] + [InlineData(typeof(JsonTokenType))] + [InlineData(typeof(Guid))] + [InlineData(typeof(short))] + [InlineData(typeof(int))] + [InlineData(typeof(long))] + [InlineData(typeof(sbyte))] + [InlineData(typeof(float))] + [InlineData(typeof(string))] + [InlineData(typeof(ushort))] + [InlineData(typeof(uint))] + [InlineData(typeof(ulong))] + public static void PrimitivesShouldFailWithArrayOrObjectAssignment(Type primitiveType) + { + // This test lines up with the built in JsonValueConverters + Assert.Throws(() => JsonSerializer.Parse(@"[]", primitiveType)); + Assert.Throws(() => JsonSerializer.Parse(@"{}", primitiveType)); + } + [Fact] public static void ReadPrimitiveArray() {