Jacek Caban : ntdll: Get TEB from signal stack pointer in init_handler.
Module: wine Branch: master Commit: e7accd7c0f9d8aa7c8c52a7d48c3374da49e32f5 URL: https://gitlab.winehq.org/wine/wine/-/commit/e7accd7c0f9d8aa7c8c52a7d48c3374... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Mon Nov 28 18:06:18 2022 +0100 ntdll: Get TEB from signal stack pointer in init_handler. We can't use NtCurrentTeb before setting %fs base. --- dlls/ntdll/unix/signal_x86_64.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index cc070dda5ae..8541dc9ccaf 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -440,6 +440,13 @@ static inline struct amd64_thread_data *amd64_thread_data(void) return (struct amd64_thread_data *)ntdll_get_thread_data()->cpu_data; } +static inline TEB *get_current_teb(void) +{ + unsigned long rsp; + __asm__( "movq %%rsp,%0" : "=r" (rsp) ); + return (TEB *)(rsp & ~signal_stack_mask); +} + static BOOL is_inside_syscall( const ucontext_t *sigcontext ) { return ((char *)RSP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && @@ -806,7 +813,11 @@ static inline void set_sigcontext( const CONTEXT *context, ucontext_t *sigcontex static inline void init_handler( const ucontext_t *sigcontext ) { #ifdef __linux__ - if (fs32_sel) arch_prctl( ARCH_SET_FS, amd64_thread_data()->pthread_teb ); + if (fs32_sel) + { + struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&get_current_teb()->GdiTebBatch; + arch_prctl( ARCH_SET_FS, ((struct amd64_thread_data *)thread_data->cpu_data)->pthread_teb ); + } #endif }
participants (1)
-
Alexandre Julliard