Module: wine Branch: master Commit: 202e0b29533ba416c08bc0d7732d95fee3d3273e URL: https://gitlab.winehq.org/wine/wine/-/commit/202e0b29533ba416c08bc0d7732d95f...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jan 31 12:12:51 2024 +0100
ntdll: Share the is_valid_frame() helper function.
---
dlls/ntdll/ntdll_misc.h | 7 +++++++ dlls/ntdll/signal_arm.c | 11 ----------- dlls/ntdll/signal_arm64.c | 11 ----------- dlls/ntdll/signal_i386.c | 18 ++++-------------- dlls/ntdll/signal_x86_64.c | 12 +++--------- 5 files changed, 14 insertions(+), 45 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 756b19ae649..e4094d341d8 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -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); diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 0e6c36e3340..d347004b601 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -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 */ diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 82466e926c2..c487e07a336 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -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 */ diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index c4b0c84abfb..3fc961e20ca 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -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; diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index e63837d3eac..30014d925d9 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -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 );