[PATCH 5/5] ntdll: Don't return the last NULL address when capturing frames.

Paul Gofman pgofman at codeweavers.com
Thu Oct 21 11:03:40 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/ntdll/signal_i386.c     | 2 +-
 dlls/ntdll/signal_x86_64.c   | 2 +-
 dlls/ntdll/tests/exception.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 108f140aeb8..a48edf864d3 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -518,7 +518,7 @@ static USHORT capture_stack_back_trace( CONTEXT *context, ULONG skip, ULONG coun
 
     for (i = 0; i < count; i++)
     {
-        if (!is_valid_frame( frame )) break;
+        if (!is_valid_frame( frame ) || !frame[1]) break;
         buffer[i] = (void *)frame[1];
         if (hash) *hash += frame[1];
         frame = (ULONG *)*frame;
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 2f91abdbee0..d3a6d9b78c5 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1509,7 +1509,7 @@ static USHORT capture_stack_back_trace( CONTEXT *context, ULONG skip, ULONG coun
         status = virtual_unwind( UNW_FLAG_NHANDLER, &dispatch, context );
         if (status != STATUS_SUCCESS) return num_entries;
 
-        if (!dispatch.EstablisherFrame) break;
+        if (!dispatch.EstablisherFrame || !context->Rip) break;
 
         if ((dispatch.EstablisherFrame & 7) ||
             dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 1d7f5ed4408..846baeda4c8 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -9143,7 +9143,7 @@ static void test_walk_stack(void)
     {
         ok(addrs[i] == addrs2[i], "i %u, addresses do not match, %p vs %p.\n", i, addrs[i], addrs2[i]);
     }
-    todo_wine ok(!!addrs[frame_count - 1], "Expected non-NULL last address.\n");
+    ok(!!addrs[frame_count - 1], "Expected non-NULL last address.\n");
 
     memset(addrs, 0xcc, sizeof(addrs));
     memset(addrs2, 0xcc, sizeof(addrs2));
@@ -9158,7 +9158,7 @@ static void test_walk_stack(void)
     {
         ok(addrs[i] == addrs2[i], "i %u, addresses do not match, %p vs %p.\n", i, addrs[i], addrs2[i]);
     }
-    todo_wine ok(!!addrs[frame_count - 1], "Expected non-NULL last address.\n");
+    ok(!!addrs[frame_count - 1], "Expected non-NULL last address.\n");
 }
 
 START_TEST(exception)
-- 
2.31.1




More information about the wine-devel mailing list