From 5985f5441d850ffd47b9b7a6b1b43302cbc91f9e Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Jul 2021 10:40:02 -0700 Subject: [PATCH 01/10] Disable array support for the COM variant wrapper classes when built-in COM is disabled. Fixes #55600 --- src/coreclr/vm/olevariant.cpp | 50 +++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/coreclr/vm/olevariant.cpp b/src/coreclr/vm/olevariant.cpp index cc747ba1635c4..8bc0107ad3436 100644 --- a/src/coreclr/vm/olevariant.cpp +++ b/src/coreclr/vm/olevariant.cpp @@ -329,20 +329,24 @@ VARTYPE OleVariant::GetVarTypeForTypeHandle(TypeHandle type) #endif #ifdef FEATURE_COMINTEROP - if (CoreLibBinder::IsClass(pMT, CLASS__DISPATCH_WRAPPER)) - return VT_DISPATCH; - if (CoreLibBinder::IsClass(pMT, CLASS__UNKNOWN_WRAPPER)) - return VT_UNKNOWN; - if (CoreLibBinder::IsClass(pMT, CLASS__ERROR_WRAPPER)) - return VT_ERROR; - if (CoreLibBinder::IsClass(pMT, CLASS__CURRENCY_WRAPPER)) - return VT_CY; - if (CoreLibBinder::IsClass(pMT, CLASS__BSTR_WRAPPER)) - return VT_BSTR; + // The wrapper types are only available when built-in COM is supported. + if (EEConfig::IsBuiltInCOMSupported()) + { + if (CoreLibBinder::IsClass(pMT, CLASS__DISPATCH_WRAPPER)) + return VT_DISPATCH; + if (CoreLibBinder::IsClass(pMT, CLASS__UNKNOWN_WRAPPER)) + return VT_UNKNOWN; + if (CoreLibBinder::IsClass(pMT, CLASS__ERROR_WRAPPER)) + return VT_ERROR; + if (CoreLibBinder::IsClass(pMT, CLASS__CURRENCY_WRAPPER)) + return VT_CY; + if (CoreLibBinder::IsClass(pMT, CLASS__BSTR_WRAPPER)) + return VT_BSTR; - // VariantWrappers cannot be stored in VARIANT's. - if (CoreLibBinder::IsClass(pMT, CLASS__VARIANT_WRAPPER)) - COMPlusThrow(kArgumentException, IDS_EE_COM_UNSUPPORTED_SIG); + // VariantWrappers cannot be stored in VARIANT's. + if (CoreLibBinder::IsClass(pMT, CLASS__VARIANT_WRAPPER)) + COMPlusThrow(kArgumentException, IDS_EE_COM_UNSUPPORTED_SIG); + } #endif // FEATURE_COMINTEROP if (pMT->IsEnum()) @@ -4857,6 +4861,11 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap } CONTRACTL_END; + if (!EEConfig::IsBuiltInComSupported()) + { + return FALSE; + } + TypeHandle hndElemType = (*pArray)->GetArrayElementTypeHandle(); if (!hndElemType.IsTypeDesc()) @@ -4864,7 +4873,10 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap if (hndElemType == TypeHandle(CoreLibBinder::GetClass(CLASS__DISPATCH_WRAPPER)) || hndElemType == TypeHandle(CoreLibBinder::GetClass(CLASS__UNKNOWN_WRAPPER))) { - *pbOfInterfaceWrappers = TRUE; + if (pbOfInterfaceWrappers) + { + *pbOfInterfaceWrappers = TRUE; + } return TRUE; } @@ -4872,7 +4884,10 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap hndElemType == TypeHandle(CoreLibBinder::GetClass(CLASS__CURRENCY_WRAPPER)) || hndElemType == TypeHandle(CoreLibBinder::GetClass(CLASS__BSTR_WRAPPER))) { - *pbOfInterfaceWrappers = FALSE; + if (pbOfInterfaceWrappers) + { + *pbOfInterfaceWrappers = FALSE; + } return TRUE; } } @@ -4889,6 +4904,7 @@ BASEARRAYREF OleVariant::ExtractWrappedObjectsFromArray(BASEARRAYREF *pArray) GC_TRIGGERS; MODE_COOPERATIVE; PRECONDITION(CheckPointer(pArray)); + PRECONDITION(IsArrayOfWrappers(pArray, NULL)); } CONTRACTL_END; @@ -5022,6 +5038,7 @@ TypeHandle OleVariant::GetWrappedArrayElementType(BASEARRAYREF *pArray) GC_TRIGGERS; MODE_COOPERATIVE; PRECONDITION(CheckPointer(pArray)); + PRECONDITION(IsArrayOfWrappers(pArray, NULL)); } CONTRACTL_END; @@ -5067,8 +5084,7 @@ TypeHandle OleVariant::GetArrayElementTypeWrapperAware(BASEARRAYREF *pArray) } CONTRACTL_END; - BOOL bArrayOfInterfaceWrappers; - if (IsArrayOfWrappers(pArray, &bArrayOfInterfaceWrappers)) + if (IsArrayOfWrappers(pArray, nullptr)) { return GetWrappedArrayElementType(pArray); } From 69d7d61da5e1f85f7208ad7b5b2fe8e66b0b0a03 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Jul 2021 11:01:31 -0700 Subject: [PATCH 02/10] Fix config call. --- src/coreclr/vm/olevariant.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/vm/olevariant.cpp b/src/coreclr/vm/olevariant.cpp index 8bc0107ad3436..f3811a5233ac0 100644 --- a/src/coreclr/vm/olevariant.cpp +++ b/src/coreclr/vm/olevariant.cpp @@ -330,7 +330,7 @@ VARTYPE OleVariant::GetVarTypeForTypeHandle(TypeHandle type) #ifdef FEATURE_COMINTEROP // The wrapper types are only available when built-in COM is supported. - if (EEConfig::IsBuiltInCOMSupported()) + if (g_pConfig->IsBuiltInCOMSupported()) { if (CoreLibBinder::IsClass(pMT, CLASS__DISPATCH_WRAPPER)) return VT_DISPATCH; @@ -4861,7 +4861,7 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap } CONTRACTL_END; - if (!EEConfig::IsBuiltInComSupported()) + if (!g_pConfig->IsBuiltInComSupported()) { return FALSE; } From 10d3b3ddea8d653804ba9df8c60469a3a87857a0 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Jul 2021 11:41:55 -0700 Subject: [PATCH 03/10] Fix one more location of wrapper class usage. --- src/coreclr/vm/mlinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/mlinfo.cpp b/src/coreclr/vm/mlinfo.cpp index 487dd236767f0..c497b1289c125 100644 --- a/src/coreclr/vm/mlinfo.cpp +++ b/src/coreclr/vm/mlinfo.cpp @@ -3863,7 +3863,7 @@ void ArrayMarshalInfo::InitElementInfo(CorNativeType arrayNativeType, MarshalInf } } #ifdef FEATURE_COMINTEROP - else if (m_thElement == TypeHandle(CoreLibBinder::GetClass(CLASS__ERROR_WRAPPER))) + else if (g_pConfig->IsBuiltInCOMSupported() && m_thElement == TypeHandle(CoreLibBinder::GetClass(CLASS__ERROR_WRAPPER))) { m_vtElement = VT_ERROR; } From 6f51a076128e8802b7512f272b7d18abc8a60eee Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Jul 2021 13:36:26 -0700 Subject: [PATCH 04/10] Fix method name. --- src/coreclr/vm/olevariant.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/olevariant.cpp b/src/coreclr/vm/olevariant.cpp index f3811a5233ac0..6c11dba08100d 100644 --- a/src/coreclr/vm/olevariant.cpp +++ b/src/coreclr/vm/olevariant.cpp @@ -4861,7 +4861,7 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap } CONTRACTL_END; - if (!g_pConfig->IsBuiltInComSupported()) + if (!g_pConfig->IsBuiltInCOMSupported()) { return FALSE; } From e0e219f39b383c3cad2fd8c91afc8e9f71536f57 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Jul 2021 13:41:00 -0700 Subject: [PATCH 05/10] Add trimming test. --- .../TrimmingTests/System.Runtime.TrimmingTests.proj | 3 +++ .../tests/TrimmingTests/TypeBuilderComDisabled.cs | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj b/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj index 2f2da7a4e1205..f0acbe28d2873 100644 --- a/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj +++ b/src/libraries/System.Runtime/tests/TrimmingTests/System.Runtime.TrimmingTests.proj @@ -35,6 +35,9 @@ as this test will ensure exceptions are using Resource keys --> --feature System.Resources.UseSystemResourceKeys true + + --feature System.Runtime.InteropServices.BuiltInComInterop.IsSupported false + diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs new file mode 100644 index 0000000000000..543abc3656757 --- /dev/null +++ b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs @@ -0,0 +1,12 @@ +using System; +using System.Reflection; +using System.Reflection.Emit; + +AssemblyBuilder assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("GeneratedAssembly"), AssemblyBuilderAccess.Run); +ModuleBuilder module = assembly.DefineDynamicModule("GeneratedModule"); +TypeBuilder genericType = module.DefineType("GeneratedType"); +genericType.DefineField("_int", typeof(int), FieldAttributes.Private); +genericType.DefineProperty("Prop", PropertyAttributes.None, typeof(string), null); + +Type generatedType = genericType.CreateType(); +return 100; From 19bca1429f0f0d1a5ecbd23818ba0a54d07eecf1 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 16 Jul 2021 13:02:36 -0700 Subject: [PATCH 06/10] Fix AV in IsArrayOfWrappers --- src/coreclr/vm/olevariant.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/coreclr/vm/olevariant.cpp b/src/coreclr/vm/olevariant.cpp index 6c11dba08100d..0f719e8c09830 100644 --- a/src/coreclr/vm/olevariant.cpp +++ b/src/coreclr/vm/olevariant.cpp @@ -4851,7 +4851,7 @@ void OleVariant::TransposeArrayData(BYTE *pDestData, BYTE *pSrcData, SIZE_T dwNu } } -BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrappers) +BOOL OleVariant::IsArrayOfWrappers(_In_ BASEARRAYREF *pArray, _Out_opt_ BOOL *pbOfInterfaceWrappers) { CONTRACTL { @@ -4892,7 +4892,9 @@ BOOL OleVariant::IsArrayOfWrappers(BASEARRAYREF *pArray, BOOL *pbOfInterfaceWrap } } - *pbOfInterfaceWrappers = FALSE; + if (pbOfInterfaceWrappers) + *pbOfInterfaceWrappers = FALSE; + return FALSE; } From 801d9c84a0ffd0aa3150b77d1ca5fd24198b8ba6 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 16 Jul 2021 14:14:31 -0700 Subject: [PATCH 07/10] Fix trimming test --- eng/testing/linker/project.csproj.template | 4 ++++ eng/testing/linker/trimmingTests.targets | 14 +++++++++++++- .../System.Runtime.TrimmingTests.proj | 2 +- .../TrimmingTests/TypeBuilderComDisabled.cs | 18 +++++++++++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template index e1ba296072c8d..c9eeb18f2718c 100644 --- a/eng/testing/linker/project.csproj.template +++ b/eng/testing/linker/project.csproj.template @@ -19,6 +19,10 @@ <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs) + + {RuntimeHostConfigurationOptions} + + {AdditionalProjectReferences} diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets index 649ad3e25bf2d..6f28258c9d783 100644 --- a/eng/testing/linker/trimmingTests.targets +++ b/eng/testing/linker/trimmingTests.targets @@ -53,6 +53,7 @@ <_projectDir>%(TestConsoleApps.ProjectDir)\ <_projectFile>%(TestConsoleApps.ProjectFile) <_projectSourceFile>%(TestConsoleApps.ProjectCompileItems) + <_extraTrimmerArgs>%(TestConsoleApps.ExtraTrimmerArgs) @@ -68,6 +69,16 @@ <_additionalProjectSourceFiles Include="%(TestConsoleApps.AdditionalSourceFiles)" /> + + <_switchesAsItems Include="%(TestConsoleApps.DisabledFeatureSwitches)" Value="false" /> + <_switchesAsItems Include="%(TestConsoleApps.EnabledFeatureSwitches)" Value="true" /> + + + + <_extraTrimmerArgs>$(_extraTrimmerArgs) @(_switchesAsItems->'--feature %(Identity) %(Value)', ' ') + <_runtimeHostConfigruationOptionsString>@(_switchesAsItems->'<RuntimeHostConfigurationOption Include="%(Identity)" Value="%(Value)" />', '%0a ') + + - --feature System.Runtime.InteropServices.BuiltInComInterop.IsSupported false + System.Runtime.InteropServices.BuiltInComInterop.IsSupported diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs index 543abc3656757..9f3cd4be7e44a 100644 --- a/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs +++ b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs @@ -4,9 +4,25 @@ AssemblyBuilder assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("GeneratedAssembly"), AssemblyBuilderAccess.Run); ModuleBuilder module = assembly.DefineDynamicModule("GeneratedModule"); -TypeBuilder genericType = module.DefineType("GeneratedType"); + +string typeName = "GeneratedType"; +TypeBuilder genericType = module.DefineType(typeName); genericType.DefineField("_int", typeof(int), FieldAttributes.Private); genericType.DefineProperty("Prop", PropertyAttributes.None, typeof(string), null); Type generatedType = genericType.CreateType(); +if (generatedType.Name != typeName) +{ + Console.WriteLine($"Unexpected name for generated type. Expected: {typeName}, Actual: {generatedType.Name}"); + return -1; +} + +object obj = Activator.CreateInstance(generatedType); +string objAsString = obj.ToString(); +if (objAsString != typeName) +{ + Console.WriteLine($"Unexpected result of ToString() for instance of generated type. Expected: {typeName}, Actual: {objAsString}"); + return -2; +} + return 100; From 8cf985be344957d6f1875ef8bd89864c2f26aca0 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 16 Jul 2021 14:21:18 -0700 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Eric Erhardt --- eng/testing/linker/trimmingTests.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets index 6f28258c9d783..0fb49d0ddecd7 100644 --- a/eng/testing/linker/trimmingTests.targets +++ b/eng/testing/linker/trimmingTests.targets @@ -76,7 +76,7 @@ <_extraTrimmerArgs>$(_extraTrimmerArgs) @(_switchesAsItems->'--feature %(Identity) %(Value)', ' ') - <_runtimeHostConfigruationOptionsString>@(_switchesAsItems->'<RuntimeHostConfigurationOption Include="%(Identity)" Value="%(Value)" />', '%0a ') + <_runtimeHostConfigurationOptionsString>@(_switchesAsItems->'<RuntimeHostConfigurationOption Include="%(Identity)" Value="%(Value)" />', '%0a ') @@ -90,7 +90,7 @@ .Replace('{UseMonoRuntime}','$(UseMonoRuntime)') .Replace('{MicrosoftNETILLinkTasksVersion}', '$(MicrosoftNETILLinkTasksVersion)') .Replace('{ExtraTrimmerArgs}', '$(_extraTrimmerArgs)') - .Replace('{RuntimeHostConfigurationOptions}', '$(_runtimeHostConfigruationOptionsString)') + .Replace('{RuntimeHostConfigurationOptions}', '$(_runtimeHostConfigurationOptionsString)') .Replace('{AdditionalProjectReferences}', '$(_additionalProjectReferencesString)') .Replace('{RepositoryEngineeringDir}', '$(RepositoryEngineeringDir)') .Replace('{MonoAOTCompilerDir}', '$(MonoAOTCompilerDir)') From ade26494d7d5d27dec8e3fca37d0a6e4e61aca2a Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 16 Jul 2021 14:36:47 -0700 Subject: [PATCH 09/10] Set Trim=true --- eng/testing/linker/trimmingTests.targets | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets index 0fb49d0ddecd7..73cb923ec60ae 100644 --- a/eng/testing/linker/trimmingTests.targets +++ b/eng/testing/linker/trimmingTests.targets @@ -53,7 +53,6 @@ <_projectDir>%(TestConsoleApps.ProjectDir)\ <_projectFile>%(TestConsoleApps.ProjectFile) <_projectSourceFile>%(TestConsoleApps.ProjectCompileItems) - <_extraTrimmerArgs>%(TestConsoleApps.ExtraTrimmerArgs) @@ -75,8 +74,7 @@ - <_extraTrimmerArgs>$(_extraTrimmerArgs) @(_switchesAsItems->'--feature %(Identity) %(Value)', ' ') - <_runtimeHostConfigurationOptionsString>@(_switchesAsItems->'<RuntimeHostConfigurationOption Include="%(Identity)" Value="%(Value)" />', '%0a ') + <_runtimeHostConfigurationOptionsString>@(_switchesAsItems->'<RuntimeHostConfigurationOption Include="%(Identity)" Value="%(Value)" Trim="true" />', '%0a ') @@ -89,7 +87,7 @@ .Replace('{RuntimeIdentifier}','%(TestConsoleApps.TestRuntimeIdentifier)') .Replace('{UseMonoRuntime}','$(UseMonoRuntime)') .Replace('{MicrosoftNETILLinkTasksVersion}', '$(MicrosoftNETILLinkTasksVersion)') - .Replace('{ExtraTrimmerArgs}', '$(_extraTrimmerArgs)') + .Replace('{ExtraTrimmerArgs}', '%(TestConsoleApps.ExtraTrimmerArgs)') .Replace('{RuntimeHostConfigurationOptions}', '$(_runtimeHostConfigurationOptionsString)') .Replace('{AdditionalProjectReferences}', '$(_additionalProjectReferencesString)') .Replace('{RepositoryEngineeringDir}', '$(RepositoryEngineeringDir)') From b1d763816d2995ab42457a7135bd5dbba8f3c97f Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 16 Jul 2021 15:31:28 -0700 Subject: [PATCH 10/10] Add licence header --- .../tests/TrimmingTests/TypeBuilderComDisabled.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs index 9f3cd4be7e44a..bb59db5e1ed0e 100644 --- a/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs +++ b/src/libraries/System.Runtime/tests/TrimmingTests/TypeBuilderComDisabled.cs @@ -1,3 +1,6 @@ +// 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.Reflection; using System.Reflection.Emit;