Module: wine Branch: master Commit: 35c1cc6c81f566b6bbc3f3159583d86dd732b7e4 URL: https://gitlab.winehq.org/wine/wine/-/commit/35c1cc6c81f566b6bbc3f3159583d86...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Jan 26 15:05:33 2024 +0100
ntdll: Clear CONTEXT_UNWOUND_TO_CALL in signal frames.
---
dlls/ntdll/signal_arm.c | 11 +++++------ dlls/ntdll/signal_arm64.c | 11 +++++------ dlls/ntdll/unix/signal_arm.c | 5 ++++- 3 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index db8955387ae..f9db361efca 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -148,10 +148,6 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX dispatch->ScopeIndex = 0; dispatch->EstablisherFrame = 0; dispatch->ControlPc = context->Pc; - /* - * TODO: CONTEXT_UNWOUND_TO_CALL should be cleared if unwound past a - * signal frame. - */ dispatch->ControlPcIsUnwound = (context->ContextFlags & CONTEXT_UNWOUND_TO_CALL) != 0; pc = context->Pc - (dispatch->ControlPcIsUnwound ? 2 : 0);
@@ -773,6 +769,7 @@ static void ms_opcode( BYTE opcode, CONTEXT *context, case 1: /* MSFT_OP_MACHINE_FRAME */ context->Pc = ((DWORD *)context->Sp)[1]; context->Sp = ((DWORD *)context->Sp)[0]; + context->ContextFlags &= ~CONTEXT_UNWOUND_TO_CALL; break; case 2: /* MSFT_OP_CONTEXT */ { @@ -1171,10 +1168,12 @@ PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG_PTR base, ULONG_PTR pc, else handler = unwind_full_data( base, pc, func, context, handler_data, ctx_ptr );
- TRACE( "ret: lr=%lx sp=%lx handler=%p\n", context->Lr, context->Sp, handler ); + TRACE( "ret: pc=%lx lr=%lx sp=%lx handler=%p\n", context->Pc, context->Lr, context->Sp, handler ); if (!context->Pc) + { context->Pc = context->Lr; - context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + } *frame_ret = context->Sp; return handler; } diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 841a4b05d96..19f7121e1e1 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -179,10 +179,6 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX dispatch->ScopeIndex = 0; dispatch->EstablisherFrame = 0; dispatch->ControlPc = context->Pc; - /* - * TODO: CONTEXT_UNWOUND_TO_CALL should be cleared if unwound past a - * signal frame. - */ dispatch->ControlPcIsUnwound = (context->ContextFlags & CONTEXT_UNWOUND_TO_CALL) != 0; pc = context->Pc - (dispatch->ControlPcIsUnwound ? 4 : 0);
@@ -786,6 +782,7 @@ static void process_unwind_codes( BYTE *ptr, BYTE *end, CONTEXT *context, { context->Pc = ((DWORD64 *)context->Sp)[1]; context->Sp = ((DWORD64 *)context->Sp)[0]; + context->ContextFlags &= ~CONTEXT_UNWOUND_TO_CALL; } else if (*ptr == 0xea) /* MSFT_OP_CONTEXT */ { @@ -1068,10 +1065,12 @@ PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG_PTR base, ULONG_PTR pc, else handler = unwind_full_data( base, pc, func, context, handler_data, ctx_ptr );
- TRACE( "ret: lr=%I64x sp=%I64x handler=%p\n", context->Lr, context->Sp, handler ); + TRACE( "ret: pc=%I64x lr=%I64x sp=%I64x handler=%p\n", context->Pc, context->Lr, context->Sp, handler ); if (!context->Pc) + { context->Pc = context->Lr; - context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + } *frame_ret = context->Sp; return handler; } diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 68c8f0c0486..148108646bb 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -549,9 +549,12 @@ static NTSTATUS ehabi_virtual_unwind( UINT ip, DWORD *frame, CONTEXT *context, *handler = NULL; /* personality */ *handler_data = NULL; /* lsda */
- context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; if (!set_pc) + { context->Pc = context->Lr; + context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + } + else context->ContextFlags &= ~CONTEXT_UNWOUND_TO_CALL;
TRACE( "next function pc=%08lx\n", context->Pc ); TRACE(" r0=%08lx r1=%08lx r2=%08lx r3=%08lx\n",