Martin Storsjo : ntdll: Properly return errors when failing to unwind.

Alexandre Julliard julliard at winehq.org
Wed Apr 22 15:29:28 CDT 2020


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

Author: Martin Storsjo <martin at martin.st>
Date:   Fri Apr 10 00:42:21 2020 +0300

ntdll: Properly return errors when failing to unwind.

If libunwind is unavailable, make libunwind_virtual_unwind return an
error. Likewise if there was no PE exception info and we didn't try
unwinding using libunwind, we need to return an error when realizing
we were unable to unwind, instead of just warning and returning
success.

This fixes hangs/infinite loops on crashes when unwinding fails.

Signed-off-by: Martin Storsjo <martin at martin.st>
Signed-off-by: André Hentschel <nerv at dawncrow.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_arm64.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 5fffd45f7b..031c271846 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -597,8 +597,10 @@ static NTSTATUS libunwind_virtual_unwind( ULONG_PTR ip, ULONG_PTR *frame, CONTEX
           context->u.s.X24, context->u.s.X25, context->u.s.X26, context->u.s.X27 );
     TRACE(" x28=%016lx  fp=%016lx  lr=%016lx  sp=%016lx\n",
           context->u.s.X28, context->u.s.Fp, context->u.s.Lr, context->Sp );
-#endif
     return STATUS_SUCCESS;
+#else
+    return STATUS_INVALID_DISPOSITION;
+#endif
 }
 
 
@@ -645,7 +647,11 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX
             return STATUS_SUCCESS;
         }
     }
-    else WARN( "exception data not found in %s\n", debugstr_w(module->BaseDllName.Buffer) );
+    else
+    {
+        WARN( "exception data not found in %s\n", debugstr_w(module->BaseDllName.Buffer) );
+        return STATUS_INVALID_DISPOSITION;
+    }
 
     dispatch->EstablisherFrame = context->u.s.Fp;
     dispatch->LanguageHandler = NULL;




More information about the wine-cvs mailing list