[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