Module: wine Branch: master Commit: e7accd7c0f9d8aa7c8c52a7d48c3374da49e32f5 URL: https://gitlab.winehq.org/wine/wine/-/commit/e7accd7c0f9d8aa7c8c52a7d48c3374...
Author: Jacek Caban jacek@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 }