From d0adff8186cbd58f4f63fe2ffdb26077a11390fd Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 28 Jun 2021 09:32:11 -0700 Subject: [PATCH] Fix alloc-dealloc mismatches (#54701) --- src/coreclr/vm/ilstubresolver.cpp | 3 +-- src/coreclr/vm/methodtable.cpp | 9 ++----- src/coreclr/vm/methodtable.h | 44 ++++++++++++++++++++++++------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/coreclr/vm/ilstubresolver.cpp b/src/coreclr/vm/ilstubresolver.cpp index 2df8f543e9e7b..74cd62a70153a 100644 --- a/src/coreclr/vm/ilstubresolver.cpp +++ b/src/coreclr/vm/ilstubresolver.cpp @@ -344,8 +344,7 @@ ILStubResolver::AllocGeneratedIL( if (!UseLoaderHeap()) { NewArrayHolder pNewILCodeBuffer = new BYTE[cbCode]; - NewArrayHolder pNewCompileTimeState = (CompileTimeState*)new BYTE[sizeof(CompileTimeState)]; - memset(pNewCompileTimeState, 0, sizeof(CompileTimeState)); + NewHolder pNewCompileTimeState = new CompileTimeState{}; NewArrayHolder pNewLocalSig = NULL; if (0 != cbLocalSig) diff --git a/src/coreclr/vm/methodtable.cpp b/src/coreclr/vm/methodtable.cpp index bb44e82990507..a81a0117e6fd1 100644 --- a/src/coreclr/vm/methodtable.cpp +++ b/src/coreclr/vm/methodtable.cpp @@ -8504,10 +8504,7 @@ MethodTable::GetMethodDataHelper( MethodDataWrapper hDecl(GetMethodData(pMTDecl, FALSE)); MethodDataWrapper hImpl(GetMethodData(pMTImpl, FALSE)); - UINT32 cb = MethodDataInterfaceImpl::GetObjectSize(pMTDecl); - NewArrayHolder pb(new BYTE[cb]); - MethodDataInterfaceImpl * pData = new (pb.GetValue()) MethodDataInterfaceImpl(rgDeclTypeIDs, cDeclTypeIDs, hDecl, hImpl); - pb.SuppressRelease(); + MethodDataInterfaceImpl * pData = new ({ pMTDecl }) MethodDataInterfaceImpl(rgDeclTypeIDs, cDeclTypeIDs, hDecl, hImpl); return pData; } // MethodTable::GetMethodDataHelper @@ -8548,10 +8545,8 @@ MethodTable::MethodData *MethodTable::GetMethodDataHelper(MethodTable *pMTDecl, } else { UINT32 cb = MethodDataObject::GetObjectSize(pMTDecl); - NewArrayHolder pb(new BYTE[cb]); MethodDataHolder h(FindParentMethodDataHelper(pMTDecl)); - pData = new (pb.GetValue()) MethodDataObject(pMTDecl, h.GetValue()); - pb.SuppressRelease(); + pData = new ({ pMTDecl }) MethodDataObject(pMTDecl, h.GetValue()); } } else { diff --git a/src/coreclr/vm/methodtable.h b/src/coreclr/vm/methodtable.h index 3d0ee06b37f34..13ff58836fe75 100644 --- a/src/coreclr/vm/methodtable.h +++ b/src/coreclr/vm/methodtable.h @@ -3157,7 +3157,7 @@ public : protected: //-------------------------------------------------------------------------------------- - class MethodDataObject : public MethodData + class MethodDataObject final : public MethodData { public: // Static method that returns the amount of memory to allocate for a particular type. @@ -3237,19 +3237,32 @@ public : { LIMITED_METHOD_CONTRACT; return m_pMDImpl; } }; - // - // At the end of this object is an array, so you cannot derive from this class. - // inline MethodDataObjectEntry *GetEntryData() - { LIMITED_METHOD_CONTRACT; return (MethodDataObjectEntry *)(this + 1); } + { LIMITED_METHOD_CONTRACT; return &m_rgEntries[0]; } inline MethodDataObjectEntry *GetEntry(UINT32 i) { LIMITED_METHOD_CONTRACT; CONSISTENCY_CHECK(i < GetNumMethods()); return GetEntryData() + i; } void FillEntryDataForAncestor(MethodTable *pMT); - // MethodDataObjectEntry m_rgEntries[...]; + // + // At the end of this object is an array + // + MethodDataObjectEntry m_rgEntries[0]; + + public: + struct TargetMethodTable + { + MethodTable* pMT; + }; + + static void* operator new(size_t size, TargetMethodTable targetMT) + { + _ASSERTE(size <= GetObjectSize(targetMT.pMT)); + return ::operator new(GetObjectSize(targetMT.pMT)); + } + static void* operator new(size_t size) = delete; }; // class MethodDataObject //-------------------------------------------------------------------------------------- @@ -3303,7 +3316,7 @@ public : }; // class MethodDataInterface //-------------------------------------------------------------------------------------- - class MethodDataInterfaceImpl : public MethodData + class MethodDataInterfaceImpl final : public MethodData { public: // Object construction-related methods @@ -3377,12 +3390,25 @@ public : // inline MethodDataEntry *GetEntryData() - { LIMITED_METHOD_CONTRACT; return (MethodDataEntry *)(this + 1); } + { LIMITED_METHOD_CONTRACT; return &m_rgEntries[0]; } inline MethodDataEntry *GetEntry(UINT32 i) { LIMITED_METHOD_CONTRACT; CONSISTENCY_CHECK(i < GetNumMethods()); return GetEntryData() + i; } - // MethodDataEntry m_rgEntries[...]; + MethodDataEntry m_rgEntries[0]; + + public: + struct TargetMethodTable + { + MethodTable* pMT; + }; + + static void* operator new(size_t size, TargetMethodTable targetMT) + { + _ASSERTE(size <= GetObjectSize(targetMT.pMT)); + return ::operator new(GetObjectSize(targetMT.pMT)); + } + static void* operator new(size_t size) = delete; }; // class MethodDataInterfaceImpl //--------------------------------------------------------------------------------------