diff options
author | chunseoklee <chunseoklee@naver.com> | 2016-06-24 21:56:55 +0900 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2016-06-24 05:56:55 -0700 |
commit | 27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5 (patch) | |
tree | bd93f1f84215299a6ca041c3cc7e6b63c61c277d /src/vm/arm/exceparm.cpp | |
parent | 99c0410601955552920079a7465c64e725814c2c (diff) | |
download | coreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.tar.gz coreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.tar.bz2 coreclr-27e0e1414b7405fa6bb49eecbf97fa1df57fb0b5.zip |
Fix Issue #5542 (#5827)
On arm32, NullReference exception for interface call is not handled
properly. Especially, when callsite is a virtualstub(dispatch/resolve), AV exception
occurs on indirect cell. Since this stub is not a part of
managed or markedjithelper, exception handler considers this is a native
seg fault.
I added :
(1) FaultingExceptionFrame construction routine for virtualstub
(2) Checking and IP-adjusting routine for VirtualStub
Diffstat (limited to 'src/vm/arm/exceparm.cpp')
-rw-r--r-- | src/vm/arm/exceparm.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/vm/arm/exceparm.cpp b/src/vm/arm/exceparm.cpp index 9b14d41c83..6852adcc33 100644 --- a/src/vm/arm/exceparm.cpp +++ b/src/vm/arm/exceparm.cpp @@ -54,6 +54,38 @@ FaultingExceptionFrame *GetFrameFromRedirectedStubStackFrame (T_DISPATCHER_CONTE return (FaultingExceptionFrame*)((TADDR)pDispatcherContext->ContextRecord->R4); } +//Return TRUE if pContext->Pc is in VirtualStub +BOOL IsIPinVirtualStub(PCODE f_IP) +{ + LIMITED_METHOD_CONTRACT; + + Thread * pThread = GetThread(); + + // We may not have a managed thread object. Example is an AV on the helper thread. + // (perhaps during StubManager::IsStub) + if (pThread == NULL) + { + return FALSE; + } + + VirtualCallStubManager::StubKind sk; + VirtualCallStubManager::FindStubManager(f_IP, &sk); + + if (sk == VirtualCallStubManager::SK_DISPATCH) + { + return TRUE; + } + else if (sk == VirtualCallStubManager::SK_RESOLVE) + { + return TRUE; + } + + else { + return FALSE; + } +} + + // Returns TRUE if caller should resume execution. BOOL AdjustContextForVirtualStub( |