diff options
author | Jan Vorlicek <janvorli@microsoft.com> | 2015-04-08 00:27:21 +0200 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2015-04-08 00:27:21 +0200 |
commit | 65f2393c54428b5b5f540805df6d7ae8b4e8d77a (patch) | |
tree | 1075c95e2ef8ef79f3e3a992483d012bd62093e2 /src/vm/exceptionhandling.h | |
parent | 838807429a0828a839958e3b7d392d65886c8f2e (diff) | |
download | coreclr-65f2393c54428b5b5f540805df6d7ae8b4e8d77a.tar.gz coreclr-65f2393c54428b5b5f540805df6d7ae8b4e8d77a.tar.bz2 coreclr-65f2393c54428b5b5f540805df6d7ae8b4e8d77a.zip |
Fix exception handling issue (#633)
This change fixes exception handling issue #633. The problem was caused by the
fact that in interleaved exception handling (when exception propagates over
one or more native / managed stack frame boundaries), we were preserving the
m_ScannedStackRange and m_sfResumeStackFrame members of the exception tracker
after unwinding a sequence of native frames and moving on into next block of
managed ones. The m_ScannedStackRange in that case contained addresses of
frames that were already unwound and in case of a rethrown exception, there
could have been new frames in that range. That lead to improper detection
of already processed frames in some cases.
The proper solution is to start with an empty scanned stack range after the
partial unwind that unwinds managed and the adjacent native frames.
Diffstat (limited to 'src/vm/exceptionhandling.h')
-rw-r--r-- | src/vm/exceptionhandling.h | 8 |
1 files changed, 0 insertions, 8 deletions
diff --git a/src/vm/exceptionhandling.h b/src/vm/exceptionhandling.h index 9362fa4a65..820f0d3c5f 100644 --- a/src/vm/exceptionhandling.h +++ b/src/vm/exceptionhandling.h @@ -669,8 +669,6 @@ private: ; // is propagated to the new tracker instance. class PartialTrackerState { - StackFrame m_sfResumeStackFrame; - StackRange m_ScannedStackRange; UINT_PTR m_uCatchToCallPC; PTR_EXCEPTION_CLAUSE_TOKEN m_pClauseForCatchToken; EE_ILEXCEPTION_CLAUSE m_ClauseForCatch; @@ -692,12 +690,6 @@ private: ; // reuse its memory, if it's non-NULL, it better be a valid thread pointer StackRange m_ScannedStackRange; - // Range used to initialize the m_ScannedStackRange at start of the 2nd pass. - // This is: - // 1) null range for non-interleaved exception handling and the very first - // 2nd pass of the interleaved handling and - // 2) non-null for the other 2nd passes of the interleaved handling. - StackRange m_secondPassInitialScannedStackRange; DAC_EXCEPTION_POINTERS m_ptrs; OBJECTHANDLE m_hThrowable; StackTraceInfo m_StackTraceInfo; |