Skip to content

Commit 9d8610c

Browse files
jkoritzinskygithub-actions
authored andcommitted
[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
1 parent 7ee35b9 commit 9d8610c

File tree

1 file changed

+10
-16
lines changed

1 file changed

+10
-16
lines changed

src/coreclr/vm/ilmarshalers.h

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3138,39 +3138,33 @@ class ILMngdMarshaler : public ILMarshaler
31383138
void EmitClearNative(ILCodeStream* pslILEmit) override
31393139
{
31403140
WRAPPER_NO_CONTRACT;
3141-
ILCodeLabel* pNoManagedValueLabel = nullptr;
31423141
if (IsFieldMarshal(m_dwMarshalFlags))
31433142
{
3144-
pNoManagedValueLabel = pslILEmit->NewCodeLabel();
3143+
ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel();
31453144
pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX);
3146-
pslILEmit->EmitBRFALSE(pNoManagedValueLabel);
3145+
pslILEmit->EmitBRTRUE(pHasManagedValueLabel);
3146+
pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX);
3147+
EmitStoreManagedHomeAddr(pslILEmit);
3148+
pslILEmit->EmitLabel(pHasManagedValueLabel);
31473149
}
31483150

31493151
EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeMethod());
3150-
3151-
if (IsFieldMarshal(m_dwMarshalFlags))
3152-
{
3153-
pslILEmit->EmitLabel(pNoManagedValueLabel);
3154-
}
31553152
}
31563153

31573154
void EmitClearNativeContents(ILCodeStream* pslILEmit) override
31583155
{
31593156
WRAPPER_NO_CONTRACT;
3160-
ILCodeLabel* pNoManagedValueLabel = nullptr;
31613157
if (IsFieldMarshal(m_dwMarshalFlags))
31623158
{
3163-
pNoManagedValueLabel = pslILEmit->NewCodeLabel();
3159+
ILCodeLabel* pHasManagedValueLabel = pslILEmit->NewCodeLabel();
31643160
pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX);
3165-
pslILEmit->EmitBRFALSE(pNoManagedValueLabel);
3161+
pslILEmit->EmitBRTRUE(pHasManagedValueLabel);
3162+
pslILEmit->EmitLDARG(StructMarshalStubs::MANAGED_STRUCT_ARGIDX);
3163+
EmitStoreManagedHomeAddr(pslILEmit);
3164+
pslILEmit->EmitLabel(pHasManagedValueLabel);
31663165
}
31673166

31683167
EmitCallMngdMarshalerMethod(pslILEmit, GetClearNativeContentsMethod());
3169-
3170-
if (IsFieldMarshal(m_dwMarshalFlags))
3171-
{
3172-
pslILEmit->EmitLabel(pNoManagedValueLabel);
3173-
}
31743168
}
31753169

31763170
bool NeedsClearCLR() override

0 commit comments

Comments
 (0)