[PATCH] ntdll: Properly return errors when failing to unwind
André Hentschel
nerv at dawncrow.de
Mon Apr 20 10:01:13 CDT 2020
Am 09.04.20 um 23:42 schrieb Martin Storsjo:
> 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>
> ---
> 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 3ed2953c33..c37e80df85 100644
> --- a/dlls/ntdll/signal_arm64.c
> +++ b/dlls/ntdll/signal_arm64.c
> @@ -599,8 +599,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
> }
>
>
> @@ -647,7 +649,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;
>
Signed-off-by: André Hentschel <nerv at dawncrow.de>
More information about the wine-devel
mailing list