ntdll: Share the is_valid_frame() helper function.
This commit is contained in:
parent
9b8409fce4
commit
202e0b2953
5 changed files with 14 additions and 45 deletions
|
@ -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 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 NTSTATUS WINAPI KiUserExceptionDispatcher(EXCEPTION_RECORD*,CONTEXT*);
|
||||
extern void WINAPI KiUserApcDispatcher(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC);
|
||||
|
|
|
@ -82,17 +82,6 @@ static void dump_scope_table( ULONG base, const SCOPE_TABLE *table )
|
|||
base + table->ScopeRecord[i].JumpTarget );
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
* 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
|
||||
*/
|
||||
|
|
|
@ -89,17 +89,6 @@ static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table )
|
|||
base + table->ScopeRecord[i].JumpTarget );
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
* 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
|
||||
*/
|
||||
|
|
|
@ -106,16 +106,6 @@ DEFINE_SYSCALL_HELPER32()
|
|||
#undef SYSCALL_ENTRY
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
* 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
|
||||
*
|
||||
|
@ -163,7 +153,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
|
|||
while (frame != (EXCEPTION_REGISTRATION_RECORD*)~0UL)
|
||||
{
|
||||
/* Check frame address */
|
||||
if (!is_valid_frame( frame ))
|
||||
if (!is_valid_frame( (ULONG_PTR)frame ))
|
||||
{
|
||||
rec->ExceptionFlags |= EH_STACK_INVALID;
|
||||
break;
|
||||
|
@ -433,7 +423,7 @@ void WINAPI __regs_RtlUnwind( EXCEPTION_REGISTRATION_RECORD* pEndFrame, PVOID ta
|
|||
if (pEndFrame && (frame > pEndFrame))
|
||||
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 */
|
||||
TRACE( "calling handler at %p code=%lx flags=%lx\n",
|
||||
|
@ -545,13 +535,13 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
|
|||
|
||||
while (skip--)
|
||||
{
|
||||
if (!is_valid_frame( frame )) return 0;
|
||||
if (!is_valid_frame( (ULONG_PTR)frame )) return 0;
|
||||
frame = (ULONG *)*frame;
|
||||
}
|
||||
|
||||
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];
|
||||
if (hash) *hash += frame[1];
|
||||
frame = (ULONG *)*frame;
|
||||
|
|
|
@ -455,9 +455,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
|
|||
unwind_done:
|
||||
if (!dispatch.EstablisherFrame) break;
|
||||
|
||||
if ((dispatch.EstablisherFrame & 7) ||
|
||||
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
|
||||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
|
||||
if (!is_valid_frame( dispatch.EstablisherFrame ))
|
||||
{
|
||||
ERR_(seh)( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
|
||||
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
|
@ -1389,9 +1387,7 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
|||
unwind_done:
|
||||
if (!dispatch.EstablisherFrame) break;
|
||||
|
||||
if ((dispatch.EstablisherFrame & 7) ||
|
||||
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
|
||||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
|
||||
if (!is_valid_frame( dispatch.EstablisherFrame ))
|
||||
{
|
||||
ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
|
||||
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
|
@ -1634,9 +1630,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
|
|||
|
||||
if (!dispatch.EstablisherFrame) break;
|
||||
|
||||
if ((dispatch.EstablisherFrame & 7) ||
|
||||
dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
|
||||
dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)
|
||||
if (!is_valid_frame( dispatch.EstablisherFrame ))
|
||||
{
|
||||
ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame,
|
||||
NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
|
|
Loading…
Add table
Reference in a new issue