Commit d00c8977 authored by Martin Storsjö's avatar Martin Storsjö Committed by Alexandre Julliard

ntdll: Error out if unwinding isn't progressing on arm.

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: 's avatarMartin Storsjö <martin@martin.st> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 4e351b47
......@@ -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",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment