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

Giovanni Mascellani gmascellani at codeweavers.com
Wed Nov 3 07:49:38 CDT 2021


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>

On 03/11/21 11:41, Paul Gofman wrote:
> 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 | 2 +-
>   3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
> index b28684839b7..5613af4bce0 100644
> --- a/dlls/ntdll/signal_i386.c
> +++ b/dlls/ntdll/signal_i386.c
> @@ -496,7 +496,7 @@ ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, U
>   
>       for (i = 0; i < count; i++)
>       {
> -        if (!is_valid_frame( frame )) break;
> +        if (!is_valid_frame( frame ) || !frame[1]) break;
>           if (i >= skip)
>           {
>               buffer[num_entries++] = (void *)frame[1];
> diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
> index 4a9c7d4b9ff..0b6bbc09ed0 100644
> --- a/dlls/ntdll/signal_x86_64.c
> +++ b/dlls/ntdll/signal_x86_64.c
> @@ -1516,7 +1516,7 @@ ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, U
>           status = virtual_unwind( UNW_FLAG_NHANDLER, &dispatch, &context );
>           if (status != STATUS_SUCCESS) break;
>   
> -        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 6e57c94703c..60f5472793f 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");
>   
>       for (requested_count = frame_count - 1; requested_count <= frame_count + 1; ++requested_count)
>       {
> 



More information about the wine-devel mailing list