From d37fe80a868e96bb56d540a0443df69945e90364 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Tue, 17 Oct 2023 12:37:05 -0400 Subject: [PATCH 1/4] [mono] Disallow casts of bounded arrays to array special interfaces Fixes https://github.com/dotnet/runtime/issues/93597 --- src/mono/mono/metadata/class.c | 2 +- .../regressions/GitHub_93597/GitHub_93597.cs | 43 +++++++++++++++++++ .../GitHub_93597/GitHub_93597.csproj | 5 +++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.cs create mode 100644 src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.csproj diff --git a/src/mono/mono/metadata/class.c b/src/mono/mono/metadata/class.c index 284e3153a1a25..c5fcd2a8d7a18 100644 --- a/src/mono/mono/metadata/class.c +++ b/src/mono/mono/metadata/class.c @@ -4100,7 +4100,7 @@ mono_class_is_assignable_from_general (MonoClass *klass, MonoClass *oklass, gboo return; } - if (m_class_is_array_special_interface (klass) && m_class_get_rank (oklass) == 1) { + if (m_class_is_array_special_interface (klass) && m_class_get_rank (oklass) == 1 && m_class_get_byval_arg (oklass)->type == MONO_TYPE_SZARRAY) { if (mono_class_is_gtd (klass)) { /* klass is an array special gtd like * IList`1<>, and oklass is X[] for some X. diff --git a/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.cs b/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.cs new file mode 100644 index 0000000000000..122ec91663b37 --- /dev/null +++ b/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.cs @@ -0,0 +1,43 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +public class ReproGH93597 { + public static int Main() { + var expected = new int[] {5,4,3,2,1}; + + const int LowerBound = 5; + + var expectedNzlba = NonZeroLowerBoundArray(expected, LowerBound); + + return Helper(expectedNzlba); + return 100; + } + [MethodImpl(MethodImplOptions.NoInlining)] + private static int Helper(Array a) { + IEnumerable ie = null; + try { + ie = (IEnumerable)a; + } catch (InvalidCastException) { + Console.WriteLine ("caught ICE, good"); + return 100; + } + ie.GetEnumerator(); // mono crashes here + return 101; + } + + + private static Array NonZeroLowerBoundArray(Array szArrayContents, int lowerBound) + { + Array array = Array.CreateInstance(szArrayContents.GetType().GetElementType(), new int[] { szArrayContents.Length }, new int[] { lowerBound }); + for (int i = 0; i < szArrayContents.Length; i++) + { + array.SetValue(szArrayContents.GetValue(i), i + lowerBound); + } + return array; + } + +} + diff --git a/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.csproj b/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.csproj new file mode 100644 index 0000000000000..a6b761d37bc58 --- /dev/null +++ b/src/tests/Loader/classloader/regressions/GitHub_93597/GitHub_93597.csproj @@ -0,0 +1,5 @@ + + + + + From 5d743a9507678386a6a9a9369ecee3b855e4b8d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Wed, 18 Oct 2023 09:57:35 -0400 Subject: [PATCH 2/4] re-enable disabled tests --- src/libraries/System.Runtime/tests/System/ArrayTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System/ArrayTests.cs b/src/libraries/System.Runtime/tests/System/ArrayTests.cs index 58382aaef42b8..13dc4f9d17f25 100644 --- a/src/libraries/System.Runtime/tests/System/ArrayTests.cs +++ b/src/libraries/System.Runtime/tests/System/ArrayTests.cs @@ -1299,7 +1299,6 @@ public static IEnumerable Copy_Array_UnreliableConversion_CanPerform_T } [Theory] - [ActiveIssue("https://github.com/dotnet/runtime/issues/93597", TestRuntimes.Mono)] [MemberData(nameof(Copy_SZArray_Reliable_TestData))] [MemberData(nameof(Copy_SZArray_PrimitiveWidening_TestData))] [MemberData(nameof(Copy_SZArray_UnreliableConversion_CanPerform_TestData))] @@ -3233,7 +3232,6 @@ public static IEnumerable Reverse_TestData() } [Theory] - [ActiveIssue("https://github.com/dotnet/runtime/issues/93597", TestRuntimes.Mono)] [MemberData(nameof(Reverse_TestData))] public static void Reverse_SZArray(Array array, int index, int length, Array expected) { From 13ed86a33de3314fe3b8b85b93e27fc9efec7632 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Wed, 18 Oct 2023 09:59:09 -0400 Subject: [PATCH 3/4] exclude lower bound regression test on NativeAOT --- src/tests/issues.targets | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/issues.targets b/src/tests/issues.targets index cf2be321cf015..f98b2d11963d1 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -1153,6 +1153,7 @@ + From 23e74306a3d8c210419094eb34150a44c1cfe736 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Wed, 18 Oct 2023 11:56:41 -0400 Subject: [PATCH 4/4] try to fix nativaot exclude --- src/tests/issues.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/issues.targets b/src/tests/issues.targets index f98b2d11963d1..f7f7378c1e311 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -1153,7 +1153,7 @@ - +