Added patch to ignore invalid exit_frame when exiting thread.

This makes the ntdll-Dealloc_Thread_Stack patchset unnecessary.
This commit is contained in:
Sebastian Lackner
2016-04-13 06:52:07 +02:00
parent 95ff86b496
commit 141fc0844c
4 changed files with 86 additions and 18 deletions

View File

@@ -0,0 +1,81 @@
From 15ef836edec8fa90f4d02d15d6b071439a65b855 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 13 Apr 2016 06:49:03 +0200
Subject: ntdll: Ignore invalid exit_frame when exiting thread.
---
dlls/ntdll/signal_i386.c | 16 ++++++++++++++++
dlls/ntdll/signal_x86_64.c | 16 ++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 9834c9f..8c09758 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2832,6 +2832,14 @@ void call_thread_func( LPTHREAD_START_ROUTINE entry, void *arg, void *frame )
void WINAPI RtlExitUserThread( ULONG status )
{
if (!ntdll_get_thread_data()->exit_frame) exit_thread( status );
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
+ {
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+ exit_thread( status );
+ }
call_thread_exit_func( status, exit_thread, ntdll_get_thread_data()->exit_frame );
}
@@ -2841,6 +2849,14 @@ void WINAPI RtlExitUserThread( ULONG status )
void abort_thread( int status )
{
if (!ntdll_get_thread_data()->exit_frame) terminate_thread( status );
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
+ {
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+ terminate_thread( status );
+ }
call_thread_exit_func( status, terminate_thread, ntdll_get_thread_data()->exit_frame );
}
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 93475d54..ffbb0f0 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3831,6 +3831,14 @@ __ASM_GLOBAL_FUNC( call_thread_exit_func,
void WINAPI RtlExitUserThread( ULONG status )
{
if (!ntdll_get_thread_data()->exit_frame) exit_thread( status );
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
+ {
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+ exit_thread( status );
+ }
call_thread_exit_func( status, exit_thread, ntdll_get_thread_data()->exit_frame );
}
@@ -3840,6 +3848,14 @@ void WINAPI RtlExitUserThread( ULONG status )
void abort_thread( int status )
{
if (!ntdll_get_thread_data()->exit_frame) terminate_thread( status );
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
+ {
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+ terminate_thread( status );
+ }
call_thread_exit_func( status, terminate_thread, ntdll_get_thread_data()->exit_frame );
}
--
2.7.1

View File

@@ -1,2 +1,3 @@
Fixes: Use a separate stack when starting new threads
Fixes: Ignore invalid exit_frame when exiting thread
Depends: ntdll-ThreadTime