[PATCH] ntdll: Properly handle 0 returns from unw_step().

Henri Verbeet hverbeet at codeweavers.com
Fri Oct 18 10:29:45 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
I.e., avoid looping forever trying to unwind the same frame. The ARM64 change
is untested, since I don't have the required hardware/setup.

 dlls/ntdll/signal_arm64.c  | 6 +++++-
 dlls/ntdll/signal_x86_64.c | 7 ++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 43e59692299..d6d5f15c874 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -523,7 +523,11 @@ static NTSTATUS libunwind_virtual_unwind( ULONG_PTR ip, ULONG_PTR *frame, CONTEX
            ip, (unsigned long)info.start_ip, (unsigned long)info.end_ip, (unsigned long)info.handler,
            (unsigned long)info.lsda, (unsigned long)info.unwind_info );
 
-    rc = unw_step( &cursor );
+    if (!(rc = unw_step( &cursor )))
+    {
+        WARN( "last frame\n" );
+        return STATUS_SUCCESS;
+    }
     if (rc < 0)
     {
         WARN( "failed to unwind: %d\n", rc );
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 6508654e778..9645c5266c8 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1524,7 +1524,12 @@ static NTSTATUS libunwind_virtual_unwind( ULONG64 ip, BOOL* got_info, ULONG64 *f
            ip, (unsigned long)info.start_ip, (unsigned long)info.end_ip, (unsigned long)info.handler,
            (unsigned long)info.lsda, (unsigned long)info.unwind_info );
 
-    rc = unw_step(&cursor);
+    if (!(rc = unw_step( &cursor )))
+    {
+        WARN( "last frame\n" );
+        *got_info = FALSE;
+        return STATUS_SUCCESS;
+    }
     if (rc < 0)
     {
         WARN( "failed to unwind: %d\n", rc );
-- 
2.11.0




More information about the wine-devel mailing list