mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
[RTL/x64] Do not overwrite the original context during exception handling
This fixes ExceptionContinueExecution cases, where we want to continue execution on the original context (or as modified by the handler), not on some halfway unwinded one.
This commit is contained in:
parent
402bc38ba7
commit
5eab2ddb2e
1 changed files with 12 additions and 6 deletions
|
@ -679,7 +679,7 @@ RtlpUnwindInternal(
|
|||
ULONG64 ImageBase, EstablisherFrame;
|
||||
CONTEXT UnwindContext;
|
||||
|
||||
/* Get the current stack limits and registration frame */
|
||||
/* Get the current stack limits */
|
||||
RtlpGetStackLimits(&StackLow, &StackHigh);
|
||||
|
||||
/* If we have a target frame, then this is our high limit */
|
||||
|
@ -708,8 +708,11 @@ RtlpUnwindInternal(
|
|||
UnwindContext.Rip = *(DWORD64*)UnwindContext.Rsp;
|
||||
UnwindContext.Rsp += sizeof(DWORD64);
|
||||
|
||||
/* Copy the context back for the next iteration */
|
||||
*ContextRecord = UnwindContext;
|
||||
if (HandlerType == UNW_FLAG_UHANDLER)
|
||||
{
|
||||
/* Copy the context back for the next iteration */
|
||||
*ContextRecord = UnwindContext;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -756,7 +759,7 @@ RtlpUnwindInternal(
|
|||
|
||||
/* Log the exception if it's enabled */
|
||||
RtlpCheckLogException(ExceptionRecord,
|
||||
ContextRecord,
|
||||
&UnwindContext,
|
||||
&DispatcherContext,
|
||||
sizeof(DispatcherContext));
|
||||
|
||||
|
@ -844,8 +847,11 @@ RtlpUnwindInternal(
|
|||
break;
|
||||
}
|
||||
|
||||
/* We have successfully unwound a frame. Copy the unwind context back. */
|
||||
*ContextRecord = UnwindContext;
|
||||
if (HandlerType == UNW_FLAG_UHANDLER)
|
||||
{
|
||||
/* We have successfully unwound a frame. Copy the unwind context back. */
|
||||
*ContextRecord = UnwindContext;
|
||||
}
|
||||
}
|
||||
|
||||
if (ExceptionRecord->ExceptionCode != STATUS_UNWIND_CONSOLIDATE)
|
||||
|
|
Loading…
Reference in a new issue