From: Rémi Bernon rbernon@codeweavers.com
--- dlls/ntdll/unix/signal_arm.c | 13 ++++++------- dlls/ntdll/unix/signal_arm64.c | 15 +++++++-------- dlls/ntdll/unix/signal_i386.c | 14 +++++++------- dlls/ntdll/unix/signal_x86_64.c | 16 ++++++++-------- 4 files changed, 28 insertions(+), 30 deletions(-)
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 681c2e3c0c1..1fc52632147 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -218,10 +218,10 @@ static inline struct arm_thread_data *arm_thread_data(void) return (struct arm_thread_data *)ntdll_get_thread_data()->cpu_data; }
-static BOOL is_inside_syscall( ucontext_t *sigcontext ) +static BOOL is_inside_syscall( void *addr ) { - return ((char *)SP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && - (char *)SP_sig(sigcontext) <= (char *)arm_thread_data()->syscall_frame); + return ((char *)addr >= (char *)ntdll_get_thread_data()->kernel_stack && + (char *)addr <= (char *)arm_thread_data()->syscall_frame); }
extern void raise_func_trampoline( EXCEPTION_RECORD *rec, CONTEXT *context, void *dispatcher ); @@ -1216,8 +1216,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void ULONG_PTR *stack = args_data;
/* if we have no syscall frame, call the callback directly */ - if ((char *)&frame < (char *)ntdll_get_thread_data()->kernel_stack || - (char *)&frame > (char *)arm_thread_data()->syscall_frame) + if (!is_inside_syscall( &frame )) { NTSTATUS (WINAPI *func)(const void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; return func( args, len ); @@ -1256,7 +1255,7 @@ static BOOL handle_syscall_fault( ucontext_t *context, EXCEPTION_RECORD *rec ) struct syscall_frame *frame = arm_thread_data()->syscall_frame; UINT i;
- if (!is_inside_syscall( context ) && !ntdll_get_thread_data()->jmp_buf) return FALSE; + if (!is_inside_syscall( (void *)SP_sig(context) ) && !ntdll_get_thread_data()->jmp_buf) return FALSE;
TRACE( "code=%lx flags=%lx addr=%p pc=%08lx\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, (DWORD)PC_sig(context) ); @@ -1485,7 +1484,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { CONTEXT context;
- if (is_inside_syscall( sigcontext )) + if (is_inside_syscall( (void *)SP_sig(sigcontext) )) { context.ContextFlags = CONTEXT_FULL; NtGetContextThread( GetCurrentThread(), &context ); diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index da78a7a8036..813853cdf70 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -163,10 +163,10 @@ static inline struct arm64_thread_data *arm64_thread_data(void) return (struct arm64_thread_data *)ntdll_get_thread_data()->cpu_data; }
-static BOOL is_inside_syscall( ucontext_t *sigcontext ) +static BOOL is_inside_syscall( void *addr ) { - return ((char *)SP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && - (char *)SP_sig(sigcontext) <= (char *)arm64_thread_data()->syscall_frame); + return ((char *)addr >= (char *)ntdll_get_thread_data()->kernel_stack && + (char *)addr <= (char *)arm64_thread_data()->syscall_frame); }
extern void raise_func_trampoline( EXCEPTION_RECORD *rec, CONTEXT *context, void *dispatcher ); @@ -1172,8 +1172,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void ULONG_PTR *stack = args_data;
/* if we have no syscall frame, call the callback directly */ - if ((char *)&frame < (char *)ntdll_get_thread_data()->kernel_stack || - (char *)&frame > (char *)arm64_thread_data()->syscall_frame) + if (!is_inside_syscall( &frame )) { NTSTATUS (WINAPI *func)(const void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; return func( args, len ); @@ -1212,7 +1211,7 @@ static BOOL handle_syscall_fault( ucontext_t *context, EXCEPTION_RECORD *rec ) struct syscall_frame *frame = arm64_thread_data()->syscall_frame; DWORD i;
- if (!is_inside_syscall( context ) && !ntdll_get_thread_data()->jmp_buf) return FALSE; + if (!is_inside_syscall( (void *)SP_sig(context) ) && !ntdll_get_thread_data()->jmp_buf) return FALSE;
TRACE( "code=%x flags=%x addr=%p pc=%p tid=%04x\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, @@ -1457,7 +1456,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { CONTEXT context;
- if (is_inside_syscall( sigcontext )) + if (is_inside_syscall( (void *)SP_sig(sigcontext) )) { context.ContextFlags = CONTEXT_FULL; NtGetContextThread( GetCurrentThread(), &context ); @@ -1484,7 +1483,7 @@ static void usr2_handler( int signal, siginfo_t *siginfo, void *sigcontext ) ucontext_t *context = sigcontext; DWORD i;
- if (!is_inside_syscall( sigcontext )) return; + if (!is_inside_syscall( (void *)SP_sig(sigcontext) )) return;
FP_sig(context) = frame->fp; LR_sig(context) = frame->lr; diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index 89af605443d..f0847913da0 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -552,10 +552,10 @@ static inline TEB *get_current_teb(void) /*********************************************************************** * is_inside_syscall */ -static BOOL is_inside_syscall( ucontext_t *sigcontext ) +static BOOL is_inside_syscall( void *addr ) { - return ((char *)ESP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && - (char *)ESP_sig(sigcontext) <= (char *)x86_thread_data()->syscall_frame); + return ((char *)addr >= (char *)ntdll_get_thread_data()->kernel_stack && + (char *)addr <= (char *)x86_thread_data()->syscall_frame); }
@@ -1654,8 +1654,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void ULONG_PTR *stack = args_data;
/* if we have no syscall frame, call the callback directly */ - if ((char *)&frame < (char *)ntdll_get_thread_data()->kernel_stack || - (char *)&frame > (char *)x86_thread_data()->syscall_frame) + if (!is_inside_syscall( &frame )) { NTSTATUS (WINAPI *func)(const void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; return func( args, len ); @@ -1771,7 +1770,7 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, void *stack_ptr, struct syscall_frame *frame = x86_thread_data()->syscall_frame; UINT i, *stack;
- if (!is_inside_syscall( sigcontext ) && !ntdll_get_thread_data()->jmp_buf) return FALSE; + if (!is_inside_syscall( (void *)ESP_sig(sigcontext) ) && !ntdll_get_thread_data()->jmp_buf) return FALSE;
TRACE( "code=%lx flags=%lx addr=%p ip=%08lx\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, context->Eip ); @@ -2078,10 +2077,11 @@ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext ) */ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { + ucontext_t *ucontext = sigcontext; struct xcontext xcontext;
init_handler( sigcontext ); - if (is_inside_syscall( sigcontext )) + if (is_inside_syscall( (void *)ESP_sig(ucontext) )) { DECLSPEC_ALIGN(64) XSTATE xs; xcontext.c.ContextFlags = CONTEXT_FULL; diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index f8a90d3caec..4453039208e 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -449,10 +449,10 @@ static inline TEB *get_current_teb(void) } #endif
-static BOOL is_inside_syscall( const ucontext_t *sigcontext ) +static BOOL is_inside_syscall( void *addr ) { - return ((char *)RSP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && - (char *)RSP_sig(sigcontext) <= (char *)amd64_thread_data()->syscall_frame); + return ((char *)addr >= (char *)ntdll_get_thread_data()->kernel_stack && + (char *)addr <= (char *)amd64_thread_data()->syscall_frame); }
@@ -831,7 +831,8 @@ static inline ucontext_t *init_handler( void *sigcontext ) static inline void leave_handler( const ucontext_t *sigcontext ) { #ifdef __linux__ - if (fs32_sel && !is_inside_signal_stack( (void *)RSP_sig(sigcontext )) && !is_inside_syscall(sigcontext)) + if (fs32_sel && !is_inside_signal_stack( (void *)RSP_sig(sigcontext )) && + !is_inside_syscall( (void *)RSP_sig(sigcontext) )) __asm__ volatile( "movw %0,%%fs" :: "r" (fs32_sel) ); #endif } @@ -1711,8 +1712,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void ULONG_PTR *stack = args_data;
/* if we have no syscall frame, call the callback directly */ - if ((char *)&frame < (char *)ntdll_get_thread_data()->kernel_stack || - (char *)&frame > (char *)amd64_thread_data()->syscall_frame) + if (!is_inside_syscall( &frame )) { NTSTATUS (WINAPI *func)(const void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; return func( args, len ); @@ -1884,7 +1884,7 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, EXCEPTION_RECORD *rec, struct syscall_frame *frame = amd64_thread_data()->syscall_frame; DWORD i;
- if (!is_inside_syscall( sigcontext ) && !ntdll_get_thread_data()->jmp_buf) return FALSE; + if (!is_inside_syscall( (void *)RSP_sig(sigcontext) ) && !ntdll_get_thread_data()->jmp_buf) return FALSE;
TRACE_(seh)( "code=%x flags=%x addr=%p ip=%lx tid=%04x\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, @@ -2189,7 +2189,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext ) ucontext_t *ucontext = init_handler( sigcontext ); struct xcontext context;
- if (is_inside_syscall( ucontext )) + if (is_inside_syscall( (void *)RSP_sig(ucontext) )) { DECLSPEC_ALIGN(64) XSTATE xs; context.c.ContextFlags = CONTEXT_FULL;