From b4991f20cb418a28fab56cf18898c319d70e3111 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 18 Aug 2016 17:43:36 +0200 Subject: [PATCH] ntdll: Remove no longer accessible TEB frames in RtlRestoreContext. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- 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 f5ecf807356..92d7b388fe6 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 ); } -- 2.11.4.GIT