[PATCH 1/2] ntdll: Error out if unwinding isn't progressing on arm

Martin Storsjö martin at martin.st
Mon Nov 15 08:02:08 CST 2021


In PE builds of wine, there's no unwind info (as LLVM hasn't
implemented generating SEH unwind info for ARM yet).

On startup of wine, an exception of the type RPC_S_SERVER_UNAVAILABLE
is raised. In a PE build of Wine, the unwind would get stuck in
an infinite loop.

This still loops for a short while; after returning the error
STATUS_INVALID_DISPOSITION, KiUserExceptionDispatcher ends up
calling RtlRaiseStatus with this status, which then tries to
unwind again, getting stuck similarly. However by recursively
trying to unwind multiple times, the process crashes fairly soon
after running out of stack.

Signed-off-by: Martin Storsjö <martin at martin.st>
---
Alternatively, should this case use a different error code, and
abort the process directly in KiUserExceptionDispatcher when we
know RtlRaiseStatus will get stuck in the same way?
---
 dlls/ntdll/unix/signal_arm.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index fc37f917219..2017cf150db 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -255,13 +255,16 @@ NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispa
     }
     if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip)
     {
-        TRACE( "no info found for %x ip %x-%x, assuming leaf function\n",
-               ip, info.start_ip, info.end_ip );
+        NTSTATUS status = context->Pc != context->Lr ?
+                          STATUS_SUCCESS : STATUS_INVALID_DISPOSITION;
+        TRACE( "no info found for %x ip %x-%x, %s\n",
+               ip, info.start_ip, info.end_ip, status == STATUS_SUCCESS ?
+               "assuming leaf function" : "error, stuck" );
         dispatch->LanguageHandler = NULL;
         dispatch->EstablisherFrame = context->Sp;
         context->Pc = context->Lr;
         context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL;
-        return STATUS_SUCCESS;
+        return status;
     }
 
     TRACE( "ip %#x function %#lx-%#lx personality %#lx lsda %#lx fde %#lx\n",
-- 
2.25.1




More information about the wine-devel mailing list