Commit 202e0b29 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Share the is_valid_frame() helper function.

parent 9b8409fc
...@@ -58,6 +58,13 @@ extern void DECLSPEC_NORETURN raise_status( NTSTATUS status, EXCEPTION_RECORD *r ...@@ -58,6 +58,13 @@ extern void DECLSPEC_NORETURN raise_status( NTSTATUS status, EXCEPTION_RECORD *r
extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr ); extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr );
extern void WINAPI process_breakpoint(void); extern void WINAPI process_breakpoint(void);
static inline BOOL is_valid_frame( ULONG_PTR frame )
{
if (frame & (sizeof(void*) - 1)) return FALSE;
return ((void *)frame >= NtCurrentTeb()->Tib.StackLimit &&
(void *)frame <= NtCurrentTeb()->Tib.StackBase);
}
extern void WINAPI LdrInitializeThunk(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR); extern void WINAPI LdrInitializeThunk(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR);
extern NTSTATUS WINAPI KiUserExceptionDispatcher(EXCEPTION_RECORD*,CONTEXT*); extern NTSTATUS WINAPI KiUserExceptionDispatcher(EXCEPTION_RECORD*,CONTEXT*);
extern void WINAPI KiUserApcDispatcher(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC); extern void WINAPI KiUserApcDispatcher(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC);
......
...@@ -83,17 +83,6 @@ static void dump_scope_table( ULONG base, const SCOPE_TABLE *table ) ...@@ -83,17 +83,6 @@ static void dump_scope_table( ULONG base, const SCOPE_TABLE *table )
} }
/******************************************************************* /*******************************************************************
* is_valid_frame
*/
static inline BOOL is_valid_frame( ULONG_PTR frame )
{
if (frame & 3) return FALSE;
return ((void *)frame >= NtCurrentTeb()->Tib.StackLimit &&
(void *)frame <= NtCurrentTeb()->Tib.StackBase);
}
/*******************************************************************
* syscalls * syscalls
*/ */
#define SYSCALL_ENTRY(id,name,args) __ASM_SYSCALL_FUNC( id, name, args ) #define SYSCALL_ENTRY(id,name,args) __ASM_SYSCALL_FUNC( id, name, args )
......
...@@ -90,17 +90,6 @@ static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table ) ...@@ -90,17 +90,6 @@ static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table )
} }
/******************************************************************* /*******************************************************************
* is_valid_frame
*/
static inline BOOL is_valid_frame( ULONG_PTR frame )
{
if (frame & 7) return FALSE;
return ((void *)frame >= NtCurrentTeb()->Tib.StackLimit &&
(void *)frame <= NtCurrentTeb()->Tib.StackBase);
}
/*******************************************************************
* syscalls * syscalls
*/ */
#define SYSCALL_ENTRY(id,name,args) __ASM_SYSCALL_FUNC( id, name ) #define SYSCALL_ENTRY(id,name,args) __ASM_SYSCALL_FUNC( id, name )
......
...@@ -107,16 +107,6 @@ DEFINE_SYSCALL_HELPER32() ...@@ -107,16 +107,6 @@ DEFINE_SYSCALL_HELPER32()
/******************************************************************* /*******************************************************************
* is_valid_frame
*/
static inline BOOL is_valid_frame( void *frame )
{
if ((ULONG_PTR)frame & 3) return FALSE;
return (frame >= NtCurrentTeb()->Tib.StackLimit &&
(void **)frame < (void **)NtCurrentTeb()->Tib.StackBase - 1);
}
/*******************************************************************
* raise_handler * raise_handler
* *
* Handler for exceptions happening inside a handler. * Handler for exceptions happening inside a handler.
...@@ -163,7 +153,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) ...@@ -163,7 +153,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
while (frame != (EXCEPTION_REGISTRATION_RECORD*)~0UL) while (frame != (EXCEPTION_REGISTRATION_RECORD*)~0UL)
{ {
/* Check frame address */ /* Check frame address */
if (!is_valid_frame( frame )) if (!is_valid_frame( (ULONG_PTR)frame ))
{ {
rec->ExceptionFlags |= EH_STACK_INVALID; rec->ExceptionFlags |= EH_STACK_INVALID;
break; break;
...@@ -433,7 +423,7 @@ void WINAPI __regs_RtlUnwind( EXCEPTION_REGISTRATION_RECORD* pEndFrame, PVOID ta ...@@ -433,7 +423,7 @@ void WINAPI __regs_RtlUnwind( EXCEPTION_REGISTRATION_RECORD* pEndFrame, PVOID ta
if (pEndFrame && (frame > pEndFrame)) if (pEndFrame && (frame > pEndFrame))
raise_status( STATUS_INVALID_UNWIND_TARGET, pRecord ); raise_status( STATUS_INVALID_UNWIND_TARGET, pRecord );
if (!is_valid_frame( frame )) raise_status( STATUS_BAD_STACK, pRecord ); if (!is_valid_frame( (ULONG_PTR)frame )) raise_status( STATUS_BAD_STACK, pRecord );
/* Call handler */ /* Call handler */
TRACE( "calling handler at %p code=%lx flags=%lx\n", TRACE( "calling handler at %p code=%lx flags=%lx\n",
...@@ -545,13 +535,13 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ...@@ -545,13 +535,13 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
while (skip--) while (skip--)
{ {
if (!is_valid_frame( frame )) return 0; if (!is_valid_frame( (ULONG_PTR)frame )) return 0;
frame = (ULONG *)*frame; frame = (ULONG *)*frame;
} }
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
if (!is_valid_frame( frame )) break; if (!is_valid_frame( (ULONG_PTR)frame )) break;
buffer[i] = (void *)frame[1]; buffer[i] = (void *)frame[1];
if (hash) *hash += frame[1]; if (hash) *hash += frame[1];
frame = (ULONG *)*frame; frame = (ULONG *)*frame;
......
...@@ -455,9 +455,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex ...@@ -455,9 +455,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
unwind_done: unwind_done:
if (!dispatch.EstablisherFrame) break; if (!dispatch.EstablisherFrame) break;
if ((dispatch.EstablisherFrame & 7) || if (!is_valid_frame( dispatch.EstablisherFrame ))
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
{ {
ERR_(seh)( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame, ERR_(seh)( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
...@@ -1389,9 +1387,7 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec ...@@ -1389,9 +1387,7 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
unwind_done: unwind_done:
if (!dispatch.EstablisherFrame) break; if (!dispatch.EstablisherFrame) break;
if ((dispatch.EstablisherFrame & 7) || if (!is_valid_frame( dispatch.EstablisherFrame ))
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
{ {
ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame, ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
...@@ -1634,9 +1630,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ...@@ -1634,9 +1630,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
if (!dispatch.EstablisherFrame) break; if (!dispatch.EstablisherFrame) break;
if ((dispatch.EstablisherFrame & 7) || if (!is_valid_frame( dispatch.EstablisherFrame ))
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
{ {
ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame, ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment