Module: wine Branch: master Commit: e7d8b401151a748f8a8655b769ac0cb36e8d81c0 URL: https://gitlab.winehq.org/wine/wine/-/commit/e7d8b401151a748f8a8655b769ac0cb...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Nov 20 12:50:49 2023 +0100
ntdll: Switch to the kernel stack to abort a thread on i386.
---
dlls/ntdll/unix/signal_i386.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index e611defc1cb..57a525aaf97 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -1652,6 +1652,27 @@ __ASM_GLOBAL_FUNC( user_mode_callback_return, "ret" )
+/*********************************************************************** + * user_mode_abort_thread + */ +extern void DECLSPEC_NORETURN user_mode_abort_thread( NTSTATUS status, struct syscall_frame *frame ); +__ASM_GLOBAL_FUNC( user_mode_abort_thread, + "movl 8(%esp),%eax\n\t" /* frame */ + "movl 0x38(%eax),%ebp\n\t" /* frame->syscall_cfa */ + "movl 4(%esp),%eax\n\t " /* status */ + "subl $8,%ebp\n\t" + /* switch to kernel stack */ + "leal -16(%ebp),%esp\n\t" + __ASM_CFI(".cfi_def_cfa %ebp,8\n\t") + __ASM_CFI(".cfi_offset %eip,-4\n\t") + __ASM_CFI(".cfi_offset %ebp,-8\n\t") + __ASM_CFI(".cfi_offset %ebx,-12\n\t") + __ASM_CFI(".cfi_offset %esi,-16\n\t") + __ASM_CFI(".cfi_offset %edi,-20\n\t") + "movl %eax,(%esp)\n\t" /* status */ + "call " __ASM_NAME("abort_thread") ) + + /*********************************************************************** * KeUserModeCallback */ @@ -2061,7 +2082,8 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext ) static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { init_handler( sigcontext ); - abort_thread(0); + if (!is_inside_syscall( sigcontext )) user_mode_abort_thread( 0, x86_thread_data()->syscall_frame ); + abort_thread( 0 ); }