Module: wine Branch: master Commit: 0b3d65f82241aa246e0c8a49c1ec37199f539f5c URL: https://source.winehq.org/git/wine.git/?a=commit;h=0b3d65f82241aa246e0c8a49c... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Dec 8 15:02:42 2021 +0100 ntdll: Don't restore the %fs register for exceptions happening inside system calls. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/signal_x86_64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 9e9a96db832..d32e38875a4 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -355,7 +355,7 @@ static inline struct amd64_thread_data *amd64_thread_data(void) return (struct amd64_thread_data *)ntdll_get_thread_data()->cpu_data; } -static BOOL is_inside_syscall( ucontext_t *sigcontext ) +static BOOL is_inside_syscall( const ucontext_t *sigcontext ) { return ((char *)RSP_sig(sigcontext) >= (char *)ntdll_get_thread_data()->kernel_stack && (char *)RSP_sig(sigcontext) <= (char *)amd64_thread_data()->syscall_frame); @@ -1544,7 +1544,7 @@ static inline void init_handler( const ucontext_t *sigcontext ) static inline void leave_handler( const ucontext_t *sigcontext ) { #ifdef __linux__ - if (fs32_sel && !is_inside_signal_stack( (void *)RSP_sig(sigcontext ))) + if (fs32_sel && !is_inside_signal_stack( (void *)RSP_sig(sigcontext )) && !is_inside_syscall(sigcontext)) __asm__ volatile( "movw %0,%%fs" :: "r" (fs32_sel) ); #endif }