From 894ce16a9bd96117391abfa537c0350c05be23b8 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 30 Mar 2021 14:54:02 -0700 Subject: [PATCH 1/2] Fix A/V in ApplyUpdate API Add thread suspend around the update API. Issue: https://github.com/dotnet/runtime/issues/50445 --- src/coreclr/vm/assemblynative.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/coreclr/vm/assemblynative.cpp b/src/coreclr/vm/assemblynative.cpp index e0098726cfe3e2..86f2b143519537 100644 --- a/src/coreclr/vm/assemblynative.cpp +++ b/src/coreclr/vm/assemblynative.cpp @@ -1442,7 +1442,9 @@ void QCALLTYPE AssemblyNative::ApplyUpdate( { COMPlusThrow(kInvalidOperationException, W("InvalidOperation_AssemblyNotEditable")); } + ThreadSuspend::SuspendEE(ThreadSuspend::SUSPEND_OTHER); HRESULT hr = ((EditAndContinueModule*)pModule)->ApplyEditAndContinue(metadataDeltaLength, metadataDelta, ilDeltaLength, ilDelta); + ThreadSuspend::RestartEE(FALSE, TRUE); if (FAILED(hr)) { COMPlusThrow(kInvalidOperationException, W("InvalidOperation_EditFailed")); From 717856808bf5e0b018d2659b94fcf46b75f13f84 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Wed, 31 Mar 2021 16:01:38 -0700 Subject: [PATCH 2/2] Remove thread suspension; switch to ResetCodeEntryPoint() --- src/coreclr/vm/assemblynative.cpp | 2 -- src/coreclr/vm/encee.cpp | 8 +++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/assemblynative.cpp b/src/coreclr/vm/assemblynative.cpp index 86f2b143519537..e0098726cfe3e2 100644 --- a/src/coreclr/vm/assemblynative.cpp +++ b/src/coreclr/vm/assemblynative.cpp @@ -1442,9 +1442,7 @@ void QCALLTYPE AssemblyNative::ApplyUpdate( { COMPlusThrow(kInvalidOperationException, W("InvalidOperation_AssemblyNotEditable")); } - ThreadSuspend::SuspendEE(ThreadSuspend::SUSPEND_OTHER); HRESULT hr = ((EditAndContinueModule*)pModule)->ApplyEditAndContinue(metadataDeltaLength, metadataDelta, ilDeltaLength, ilDelta); - ThreadSuspend::RestartEE(FALSE, TRUE); if (FAILED(hr)) { COMPlusThrow(kInvalidOperationException, W("InvalidOperation_EditFailed")); diff --git a/src/coreclr/vm/encee.cpp b/src/coreclr/vm/encee.cpp index 1e907d0d81f842..4ecff954111da1 100644 --- a/src/coreclr/vm/encee.cpp +++ b/src/coreclr/vm/encee.cpp @@ -330,7 +330,13 @@ HRESULT EditAndContinueModule::UpdateMethod(MethodDesc *pMethod) // to the Method's code must be to the call/jmp blob immediately in front of the // MethodDesc itself. See MethodDesc::IsEnCMethod() // - pMethod->Reset(); + pMethod->ResetCodeEntryPoint(); + + if (pMethod->HasNativeCodeSlot()) + { + RelativePointer *pRelPtr = (RelativePointer *)pMethod->GetAddrOfNativeCodeSlot(); + pRelPtr->SetValueMaybeNull(NULL); + } return S_OK; }