From 26301ae74e7225c49156519c7f3cbdf71f79044f Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Fri, 6 Oct 2023 12:28:40 -0700 Subject: [PATCH 1/2] [release/6.0] Fix a memory leak in runtime interop stubs when using an array of structs of types that use old-style managed marshalers --- src/coreclr/vm/ilmarshalers.h | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/coreclr/vm/ilmarshalers.h b/src/coreclr/vm/ilmarshalers.h index f3c9f31628f156..7cbbef24073e56 100644 --- a/src/coreclr/vm/ilmarshalers.h +++ b/src/coreclr/vm/ilmarshalers.h @@ -3138,39 +3138,33 @@ class ILMngdMarshaler : public ILMarshaler void EmitClearNative(ILCodeStream* pslILEmit) override { WRAPPER_NO_CONTRACT; - ILCodeLabel* pNoManagedValueLabel = nullptr; if (IsFieldMarshal(m_dwMarshalFlags)) { - pNoManagedValueLabel = pslILEmit->NewCodeLabel(); + ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel(); pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - pslILEmit->EmitBRFALSE(pNoManagedValueLabel); + pslILEmit->EmitBRTRUE(pHasManagedValueLabel); + pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); + EmitStoreManagedHomeAddr(pslILEmit); + pslILEmit->EmitLabel(pHasManagedValueLabel); } EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeMethod()); - - if (IsFieldMarshal(m_dwMarshalFlags)) - { - pslILEmit->EmitLabel(pNoManagedValueLabel); - } } void EmitClearNativeContents(ILCodeStream* pslILEmit) override { WRAPPER_NO_CONTRACT; - ILCodeLabel* pNoManagedValueLabel = nullptr; if (IsFieldMarshal(m_dwMarshalFlags)) { - pNoManagedValueLabel = pslILEmit->NewCodeLabel(); + ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel(); pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - pslILEmit->EmitBRFALSE(pNoManagedValueLabel); + pslILEmit->EmitBRTRUE(pHasManagedValueLabel); + pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); + EmitStoreManagedHomeAddr(pslILEmit); + pslILEmit->EmitLabel(pHasManagedValueLabel); } EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeContentsMethod()); - - if (IsFieldMarshal(m_dwMarshalFlags)) - { - pslILEmit->EmitLabel(pNoManagedValueLabel); - } } bool NeedsClearCLR() override From c5037668692aabd4d47d8c903781ead6c08f0eea Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 9 Oct 2023 11:11:43 -0700 Subject: [PATCH 2/2] We already normalize null refs early, so we don't need to normalize here. --- src/coreclr/vm/ilmarshalers.h | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/coreclr/vm/ilmarshalers.h b/src/coreclr/vm/ilmarshalers.h index 7cbbef24073e56..61ff10ac2b2b86 100644 --- a/src/coreclr/vm/ilmarshalers.h +++ b/src/coreclr/vm/ilmarshalers.h @@ -3138,32 +3138,12 @@ class ILMngdMarshaler : public ILMarshaler void EmitClearNative(ILCodeStream* pslILEmit) override { WRAPPER_NO_CONTRACT; - if (IsFieldMarshal(m_dwMarshalFlags)) - { - ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel(); - pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - pslILEmit->EmitBRTRUE(pHasManagedValueLabel); - pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - EmitStoreManagedHomeAddr(pslILEmit); - pslILEmit->EmitLabel(pHasManagedValueLabel); - } - EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeMethod()); } void EmitClearNativeContents(ILCodeStream* pslILEmit) override { WRAPPER_NO_CONTRACT; - if (IsFieldMarshal(m_dwMarshalFlags)) - { - ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel(); - pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - pslILEmit->EmitBRTRUE(pHasManagedValueLabel); - pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX); - EmitStoreManagedHomeAddr(pslILEmit); - pslILEmit->EmitLabel(pHasManagedValueLabel); - } - EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeContentsMethod()); }