Alexandre Julliard : ntdll: Assume leaf function when we can' t find exception information for an ELF module.

Alexandre Julliard julliard at winehq.org
Fri Oct 16 11:26:09 CDT 2009


Module: wine
Branch: master
Commit: 905609b73bfdedf9b409a3ff86ac9767d9a00af4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=905609b73bfdedf9b409a3ff86ac9767d9a00af4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Oct 16 13:39:15 2009 +0200

ntdll: Assume leaf function when we can't find exception information for an ELF module.

---

 dlls/ntdll/signal_x86_64.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index b5ff237..94b3d3c 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1849,9 +1849,10 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
             const struct dwarf_fde *fde = _Unwind_Find_FDE( (void *)(context.Rip - 1), &bases );
             if (!fde)
             {
-                ERR( "no exception data found in %s for function %lx\n",
-                     module ? debugstr_w(module->BaseDllName.Buffer) : "system library", context.Rip );
-                break;
+                /* assume leaf function */
+                context.Rip = *(ULONG64 *)context.Rsp;
+                context.Rsp += sizeof(ULONG64);
+                continue;
             }
             status = dwarf_virtual_unwind( context.Rip, &dispatch.EstablisherFrame, &new_context,
                                            fde, &bases, &dispatch.LanguageHandler, &dispatch.HandlerData );
@@ -2712,9 +2713,10 @@ void WINAPI RtlUnwindEx( ULONG64 end_frame, ULONG64 target_ip, EXCEPTION_RECORD
             const struct dwarf_fde *fde = _Unwind_Find_FDE( (void *)(context.Rip - 1), &bases );
             if (!fde)
             {
-                ERR( "no exception data found in %s for function %lx\n",
-                     module ? debugstr_w(module->BaseDllName.Buffer) : "system library", context.Rip );
-                raise_status( STATUS_BAD_FUNCTION_TABLE, rec );
+                /* assume leaf function */
+                context.Rip = *(ULONG64 *)context.Rsp;
+                context.Rsp += sizeof(ULONG64);
+                continue;
             }
             dispatch.FunctionEntry = NULL;
             status = dwarf_virtual_unwind( context.Rip, &dispatch.EstablisherFrame, &new_context, fde,




More information about the wine-cvs mailing list