ntdll: Only call TEB handlers for frames inside the current stack.
This commit is contained in:
parent
202e0b2953
commit
8fe95d29d3
3 changed files with 15 additions and 9 deletions
|
@ -445,7 +445,7 @@ static NTSTATUS call_function_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_con
|
|||
}
|
||||
}
|
||||
/* hack: call wine handlers registered in the tib list */
|
||||
else while ((DWORD)teb_frame < context.Sp)
|
||||
else while (is_valid_frame( (ULONG_PTR)teb_frame ) && (DWORD)teb_frame < context.Sp)
|
||||
{
|
||||
TRACE( "found wine frame %p rsp %lx handler %p\n",
|
||||
teb_frame, context.Sp, teb_frame->Handler );
|
||||
|
@ -1294,7 +1294,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
|
|||
}
|
||||
|
||||
/* hack: remove no longer accessible TEB frames */
|
||||
while ((DWORD)teb_frame < context->Sp)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) && (DWORD)teb_frame < context->Sp)
|
||||
{
|
||||
TRACE( "removing TEB frame: %p\n", teb_frame );
|
||||
teb_frame = __wine_pop_frame( teb_frame );
|
||||
|
@ -1394,7 +1394,9 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
|||
else /* hack: call builtin handlers registered in the tib list */
|
||||
{
|
||||
DWORD backup_frame = dispatch.EstablisherFrame;
|
||||
while ((DWORD)teb_frame < new_context.Sp && (DWORD)teb_frame < (DWORD)end_frame)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) &&
|
||||
(DWORD)teb_frame < new_context.Sp &&
|
||||
(DWORD)teb_frame < (DWORD)end_frame)
|
||||
{
|
||||
TRACE( "found builtin frame %p handler %p\n", teb_frame, teb_frame->Handler );
|
||||
dispatch.EstablisherFrame = (DWORD)teb_frame;
|
||||
|
|
|
@ -418,7 +418,7 @@ static NTSTATUS call_function_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_con
|
|||
}
|
||||
}
|
||||
/* hack: call wine handlers registered in the tib list */
|
||||
else while ((ULONG64)teb_frame < context.Sp)
|
||||
else while (is_valid_frame( (ULONG_PTR)teb_frame ) && (ULONG64)teb_frame < context.Sp)
|
||||
{
|
||||
TRACE( "found wine frame %p rsp %I64x handler %p\n",
|
||||
teb_frame, context.Sp, teb_frame->Handler );
|
||||
|
@ -1188,7 +1188,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
|
|||
}
|
||||
|
||||
/* hack: remove no longer accessible TEB frames */
|
||||
while ((ULONG64)teb_frame < context->Sp)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) && (ULONG64)teb_frame < context->Sp)
|
||||
{
|
||||
TRACE( "removing TEB frame: %p\n", teb_frame );
|
||||
teb_frame = __wine_pop_frame( teb_frame );
|
||||
|
@ -1295,7 +1295,9 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
|||
else /* hack: call builtin handlers registered in the tib list */
|
||||
{
|
||||
DWORD64 backup_frame = dispatch.EstablisherFrame;
|
||||
while ((ULONG64)teb_frame < new_context.Sp && (ULONG64)teb_frame < (ULONG64)end_frame)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) &&
|
||||
(ULONG64)teb_frame < new_context.Sp &&
|
||||
(ULONG64)teb_frame < (ULONG64)end_frame)
|
||||
{
|
||||
TRACE( "found builtin frame %p handler %p\n", teb_frame, teb_frame->Handler );
|
||||
dispatch.EstablisherFrame = (ULONG64)teb_frame;
|
||||
|
|
|
@ -491,7 +491,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
|
|||
}
|
||||
}
|
||||
/* hack: call wine handlers registered in the tib list */
|
||||
else while ((ULONG64)teb_frame < context.Rsp)
|
||||
else while (is_valid_frame( (ULONG_PTR)teb_frame ) && (ULONG64)teb_frame < context.Rsp)
|
||||
{
|
||||
TRACE_(seh)( "found wine frame %p rsp %p handler %p\n",
|
||||
teb_frame, (void *)context.Rsp, teb_frame->Handler );
|
||||
|
@ -1321,7 +1321,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
|
|||
}
|
||||
|
||||
/* hack: remove no longer accessible TEB frames */
|
||||
while ((ULONG64)teb_frame < context->Rsp)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) && (ULONG64)teb_frame < context->Rsp)
|
||||
{
|
||||
TRACE_(seh)( "removing TEB frame: %p\n", teb_frame );
|
||||
teb_frame = __wine_pop_frame( teb_frame );
|
||||
|
@ -1422,7 +1422,9 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
|||
else /* hack: call builtin handlers registered in the tib list */
|
||||
{
|
||||
DWORD64 backup_frame = dispatch.EstablisherFrame;
|
||||
while ((ULONG64)teb_frame < new_context.Rsp && (ULONG64)teb_frame < (ULONG64)end_frame)
|
||||
while (is_valid_frame( (ULONG_PTR)teb_frame ) &&
|
||||
(ULONG64)teb_frame < new_context.Rsp &&
|
||||
(ULONG64)teb_frame < (ULONG64)end_frame)
|
||||
{
|
||||
TRACE( "found builtin frame %p handler %p\n", teb_frame, teb_frame->Handler );
|
||||
dispatch.EstablisherFrame = (ULONG64)teb_frame;
|
||||
|
|
Loading…
Add table
Reference in a new issue