From 74442b73ad82e8425c4043350cda57788944636f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Foidl?= Date: Sun, 9 Oct 2022 16:27:06 +0200 Subject: [PATCH 1/4] Added test cases --- .../tests/Base64/Base64DecoderUnitTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs index 1b447f8faa7dfc..94f93db56f0d6c 100644 --- a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs +++ b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs @@ -272,6 +272,23 @@ public void BasicDecodingWithFinalBlockTrueKnownInputInvalid(string inputString, Assert.True(Base64TestHelper.VerifyDecodingCorrectness(expectedConsumed, decodedBytes.Length, source, decodedBytes)); } + [Theory] + [InlineData("ìz/T", 0, 0)] // scalar code-path + [InlineData("z/Ta123ì", 4, 3)] + [InlineData("ìz/TpH7sqEkerqMweH1uSw==", 0, 0)] // Vector128 code-path + [InlineData("z/TpH7sqEkerqMweH1uSwì==", 20, 15)] + [InlineData("ìz/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epo==", 0, 0)] // Vector256 / AVX code-path + [InlineData("z/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epoì==", 44, 33)] + public void BasicDecodingNonAsciiInputInvalid(string inputString, int expectedConsumed, int expectedWritten) + { + Span source = Encoding.UTF8.GetBytes(inputString); + Span decodedBytes = new byte[Base64.GetMaxDecodedFromUtf8Length(source.Length)]; + + Assert.Equal(OperationStatus.InvalidData, Base64.DecodeFromUtf8(source, decodedBytes, out int consumed, out int decodedByteCount)); + Assert.Equal(expectedConsumed, consumed); + Assert.Equal(expectedWritten, decodedByteCount); // expectedWritten == decodedBytes.Length + } + [Theory] [InlineData("AQID", 3)] [InlineData("AQIDBAUG", 6)] From 8ccd64f467f202c900e2f49e8f58d55d038bfc11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Foidl?= Date: Sun, 9 Oct 2022 16:28:45 +0200 Subject: [PATCH 2/4] Fix --- .../src/System/Buffers/Text/Base64Decoder.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Decoder.cs b/src/libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Decoder.cs index b0c491a5beaba7..2ec9959536427e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Decoder.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Decoder.cs @@ -592,8 +592,9 @@ private static unsafe void Vector128Decode(ref byte* srcBytes, ref byte* destByt // lookup Vector128 hiNibbles = Vector128.ShiftRightLogical(str.AsInt32(), 4).AsByte() & mask2F; + Vector128 loNibbles = str & mask2F; Vector128 hi = SimdShuffle(lutHi, hiNibbles, mask8F); - Vector128 lo = SimdShuffle(lutLo, str, mask8F); + Vector128 lo = SimdShuffle(lutLo, loNibbles, mask8F); // Check for invalid input: if any "and" values from lo and hi are not zero, // fall back on bytewise code to do error checking and reporting: From a2b1ae143d1c993088d6084ed7828688fed8a526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Foidl?= Date: Sun, 9 Oct 2022 17:34:17 +0200 Subject: [PATCH 3/4] Use unicode escape sequence in tests --- .../tests/Base64/Base64DecoderUnitTests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs index 94f93db56f0d6c..4a00067d05918c 100644 --- a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs +++ b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs @@ -273,12 +273,12 @@ public void BasicDecodingWithFinalBlockTrueKnownInputInvalid(string inputString, } [Theory] - [InlineData("ìz/T", 0, 0)] // scalar code-path - [InlineData("z/Ta123ì", 4, 3)] - [InlineData("ìz/TpH7sqEkerqMweH1uSw==", 0, 0)] // Vector128 code-path - [InlineData("z/TpH7sqEkerqMweH1uSwì==", 20, 15)] - [InlineData("ìz/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epo==", 0, 0)] // Vector256 / AVX code-path - [InlineData("z/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epoì==", 44, 33)] + [InlineData("\u00ecz/T", 0, 0)] // scalar code-path + [InlineData("z/Ta123\u00ec", 4, 3)] + [InlineData("\u00ecz/TpH7sqEkerqMweH1uSw==", 0, 0)] // Vector128 code-path + [InlineData("z/TpH7sqEkerqMweH1uSw\u00ec==", 20, 15)] + [InlineData("\u00ecz/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epo==", 0, 0)] // Vector256 / AVX code-path + [InlineData("z/TpH7sqEkerqMweH1uSw1a5ebaAF9xa8B0ze1wet4epo\u00ec==", 44, 33)] public void BasicDecodingNonAsciiInputInvalid(string inputString, int expectedConsumed, int expectedWritten) { Span source = Encoding.UTF8.GetBytes(inputString); From 814b34d4d3e85be1272314e56d9b88f004308e11 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Mon, 10 Oct 2022 15:01:54 +0200 Subject: [PATCH 4/4] Apply suggestions from code review --- .../System.Memory/tests/Base64/Base64DecoderUnitTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs index 4a00067d05918c..4e11de38490591 100644 --- a/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs +++ b/src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs @@ -286,7 +286,7 @@ public void BasicDecodingNonAsciiInputInvalid(string inputString, int expectedCo Assert.Equal(OperationStatus.InvalidData, Base64.DecodeFromUtf8(source, decodedBytes, out int consumed, out int decodedByteCount)); Assert.Equal(expectedConsumed, consumed); - Assert.Equal(expectedWritten, decodedByteCount); // expectedWritten == decodedBytes.Length + Assert.Equal(expectedWritten, decodedByteCount); } [Theory]