Martin Storsjö : ntdll: Subtract an offset from pc if dispatch->ControlPcIsUnwound on arm.

Alexandre Julliard julliard at winehq.org
Mon Nov 15 16:01:29 CST 2021


Module: wine
Branch: master
Commit: 1fb4ce83f409539da74d994f5a37ed839ef6e9c0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1fb4ce83f409539da74d994f5a37ed839ef6e9c0

Author: Martin Storsjö <martin at martin.st>
Date:   Mon Nov 15 16:02:09 2021 +0200

ntdll: Subtract an offset from pc if dispatch->ControlPcIsUnwound on arm.

This fixes unwinding from functions ending with a call to a function
that won't return. This matches what is done on the PE side in the
call to lookup_function_info.

Signed-off-by: Martin Storsjö <martin at martin.st>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_arm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index 2017cf150db..ebc08984adf 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -229,7 +229,7 @@ extern void raise_func_trampoline( EXCEPTION_RECORD *rec, CONTEXT *context, void
 NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context )
 {
 #ifdef HAVE_LIBUNWIND
-    DWORD ip = context->Pc;
+    DWORD ip = context->Pc - (dispatch->ControlPcIsUnwound ? 2 : 0);
     unw_context_t unw_context;
     unw_cursor_t cursor;
     unw_proc_info_t info;




More information about the wine-cvs mailing list