From 4cfe5a6ddb4ce8d8c02c9df3a5dbf8914a56011e Mon Sep 17 00:00:00 2001 From: John Glover Date: Thu, 1 Aug 2024 22:55:56 -0700 Subject: [PATCH 1/3] Fixed hexadecimal and octal deserialization from unknown. --- .../Serialization/SerializationTests.cs | 28 +++++++++++++++++++ .../ScalarNodeDeserializer.cs | 14 ++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/YamlDotNet.Test/Serialization/SerializationTests.cs b/YamlDotNet.Test/Serialization/SerializationTests.cs index 0d619904a..03a539b95 100644 --- a/YamlDotNet.Test/Serialization/SerializationTests.cs +++ b/YamlDotNet.Test/Serialization/SerializationTests.cs @@ -164,6 +164,34 @@ public void DeserializeScalarLongBase60Number() result.Should().Be(77744246530L); } + [Fact] + public void DeserializeScalarBase16FromUnknown() + { + IDeserializer deserializer = new DeserializerBuilder() + .WithAttemptingUnquotedStringTypeDeserialization() + .Build(); + + var expected = "0x8000"; + + var result = deserializer.Deserialize(new StringReader(expected)); + + result.Should().Be((ulong)32768); + } + + [Fact] + public void DeserializeScalarBase8FromUnknown() + { + IDeserializer deserializer = new DeserializerBuilder() + .WithAttemptingUnquotedStringTypeDeserialization() + .Build(); + + var expected = "0o100000"; + + var result = deserializer.Deserialize(new StringReader(expected)); + + result.Should().Be((ulong)32768); + } + [Theory] [InlineData(EnumExample.One)] [InlineData(EnumExample.One | EnumExample.Two)] diff --git a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs index 175376ee0..47a2d2f5a 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs @@ -355,24 +355,16 @@ private static object CastInteger(ulong number, TypeCode typeCode) default: if (Regex.IsMatch(v, "0x[0-9a-fA-F]+")) //base16 number { - if (TryAndSwallow(() => Convert.ToByte(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt16(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt32(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt64(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToUInt64(v, 16), out result)) { } + if (TryAndSwallow(() => Convert.ToUInt64(v, 16), out result)) { } else { //we couldn't parse it, default to a string. It's probably to big. result = v; } } - else if (Regex.IsMatch(v, "0o[0-9a-fA-F]+")) //base8 number + else if (Regex.IsMatch(v, "0o[0-7]+")) //base8 number { - if (TryAndSwallow(() => Convert.ToByte(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt16(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt32(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt64(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToUInt64(v, 8), out result)) { } + if (TryAndSwallow(() => Convert.ToUInt64(v.Substring(2), 8), out result)) { } else { //we couldn't parse it, default to a string. It's probably to big. From 1517c404cd037e5b45dae11429572339deb40207 Mon Sep 17 00:00:00 2001 From: John Glover Date: Fri, 2 Aug 2024 19:58:31 -0700 Subject: [PATCH 2/3] Updated tests for the octal and hex deserialization from unknown with boundary cases. --- .../Serialization/SerializationTests.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/YamlDotNet.Test/Serialization/SerializationTests.cs b/YamlDotNet.Test/Serialization/SerializationTests.cs index 03a539b95..55511e27d 100644 --- a/YamlDotNet.Test/Serialization/SerializationTests.cs +++ b/YamlDotNet.Test/Serialization/SerializationTests.cs @@ -164,32 +164,38 @@ public void DeserializeScalarLongBase60Number() result.Should().Be(77744246530L); } - [Fact] - public void DeserializeScalarBase16FromUnknown() + [Theory] + [InlineData("0o0", 0)] + [InlineData("0x8000", 32768)] + [InlineData("0xFFFFFFFFFFFFFFFF", 18_446_744_073_709_551_615)] + public void DeserializeScalarBase16FromUnknown(string yaml, ulong value) { IDeserializer deserializer = new DeserializerBuilder() .WithAttemptingUnquotedStringTypeDeserialization() .Build(); - var expected = "0x8000"; + var expected = yaml; var result = deserializer.Deserialize(new StringReader(expected)); - result.Should().Be((ulong)32768); + result.Should().Be(value); } - [Fact] - public void DeserializeScalarBase8FromUnknown() + [Theory] + [InlineData("0o0", 0)] + [InlineData("0o100000", 32768)] + [InlineData("0o1777777777777777777777", 18_446_744_073_709_551_615)] + public void DeserializeScalarBase8FromUnknown(string yaml, ulong value) { IDeserializer deserializer = new DeserializerBuilder() .WithAttemptingUnquotedStringTypeDeserialization() .Build(); - var expected = "0o100000"; + var expected = yaml; var result = deserializer.Deserialize(new StringReader(expected)); - result.Should().Be((ulong)32768); + result.Should().Be(value); } [Theory] From 7773a4eb431bfa48b64fb8f7863fd7a143496ea9 Mon Sep 17 00:00:00 2001 From: John Glover Date: Fri, 2 Aug 2024 20:47:54 -0700 Subject: [PATCH 3/3] Removed extraneous declaration in the unit tests. --- YamlDotNet.Test/Serialization/SerializationTests.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/YamlDotNet.Test/Serialization/SerializationTests.cs b/YamlDotNet.Test/Serialization/SerializationTests.cs index 55511e27d..d30c5968e 100644 --- a/YamlDotNet.Test/Serialization/SerializationTests.cs +++ b/YamlDotNet.Test/Serialization/SerializationTests.cs @@ -174,9 +174,7 @@ public void DeserializeScalarBase16FromUnknown(string yaml, ulong value) .WithAttemptingUnquotedStringTypeDeserialization() .Build(); - var expected = yaml; - - var result = deserializer.Deserialize(new StringReader(expected)); + var result = deserializer.Deserialize(new StringReader(yaml)); result.Should().Be(value); } @@ -191,9 +189,7 @@ public void DeserializeScalarBase8FromUnknown(string yaml, ulong value) .WithAttemptingUnquotedStringTypeDeserialization() .Build(); - var expected = yaml; - - var result = deserializer.Deserialize(new StringReader(expected)); + var result = deserializer.Deserialize(new StringReader(yaml)); result.Should().Be(value); }