Piotr Caban : ntdll: Remove no longer accessible TEB frames in RtlRestoreContext.

Alexandre Julliard julliard at winehq.org
Tue Aug 23 11:28:44 CDT 2016


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Aug 18 17:43:36 2016 +0200

ntdll: Remove no longer accessible TEB frames in RtlRestoreContext.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_x86_64.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index f5ecf80..92d7b38 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3557,6 +3557,8 @@ __ASM_GLOBAL_FUNC( call_consolidate_callback,
  */
 void WINAPI RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
 {
+    EXCEPTION_REGISTRATION_RECORD *teb_frame = NtCurrentTeb()->Tib.ExceptionList;
+
     if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
     {
         struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
@@ -3586,6 +3588,14 @@ void WINAPI RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
         TRACE( "calling consolidate callback %p (rec=%p)\n", consolidate, rec );
         context->Rip = (ULONG64)call_consolidate_callback( context, consolidate, rec );
     }
+
+    /* hack: remove no longer accessible TEB frames */
+    while ((ULONG64)teb_frame < context->Rsp)
+    {
+        TRACE( "removing TEB frame: %p\n", teb_frame );
+        teb_frame = __wine_pop_frame( teb_frame );
+    }
+
     TRACE( "returning to %lx stack %lx\n", context->Rip, context->Rsp );
     set_cpu_context( context );
 }




More information about the wine-cvs mailing list