Module: wine Branch: master Commit: 079179fec720780679db3eed90adcc257f4ff240 URL: https://gitlab.winehq.org/wine/wine/-/commit/079179fec720780679db3eed90adcc2...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 19 19:42:26 2022 +0200
ntdll: Suppress callback exceptions in KiUserCallbackDispatcher.
---
dlls/ntdll/signal_arm.c | 16 ++++++++++++++-- dlls/ntdll/signal_arm64.c | 16 ++++++++++++++-- dlls/ntdll/signal_i386.c | 16 ++++++++++++++-- dlls/ntdll/signal_x86_64.c | 16 ++++++++++++++-- dlls/ntdll/unix/signal_arm.c | 3 +++ dlls/ntdll/unix/signal_arm64.c | 3 +++ dlls/ntdll/unix/signal_i386.c | 3 +++ dlls/ntdll/unix/signal_x86_64.c | 3 +++ 8 files changed, 68 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index d0229d934ce..c3674487277 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -533,9 +533,21 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1 */ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) { - NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + NTSTATUS status; + + __TRY + { + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + status = NtCallbackReturn( NULL, 0, func( args, len )); + } + __EXCEPT_ALL + { + ERR_(seh)( "ignoring exception\n" ); + status = NtCallbackReturn( 0, 0, 0 ); + } + __ENDTRY
- RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); + RtlRaiseStatus( status ); }
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 959c3ea50dc..ee3204ebce8 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -576,9 +576,21 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR arg1, ULONG_PTR arg */ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) { - NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + NTSTATUS status; + + __TRY + { + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + status = NtCallbackReturn( NULL, 0, func( args, len )); + } + __EXCEPT_ALL + { + ERR_(seh)( "ignoring exception\n" ); + status = NtCallbackReturn( 0, 0, 0 ); + } + __ENDTRY
- RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); + RtlRaiseStatus( status ); }
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index f4c935ecc94..ae065f8c37b 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -257,9 +257,21 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1 */ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) { - NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + NTSTATUS status; + + __TRY + { + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + status = NtCallbackReturn( NULL, 0, func( args, len )); + } + __EXCEPT_ALL + { + ERR_(seh)( "ignoring exception\n" ); + status = NtCallbackReturn( 0, 0, 0 ); + } + __ENDTRY
- RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); + RtlRaiseStatus( status ); }
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 9957d0c3dfa..b1ab4933b93 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -661,9 +661,21 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher, */ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) { - NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + NTSTATUS status; + + __TRY + { + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + status = NtCallbackReturn( NULL, 0, func( args, len )); + } + __EXCEPT_ALL + { + ERR_(seh)( "ignoring exception\n" ); + status = NtCallbackReturn( 0, 0, 0 ); + } + __ENDTRY
- RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); + RtlRaiseStatus( status ); }
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 73843ba56a6..5d1478a1ff4 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -721,6 +721,7 @@ struct user_callback_frame ULONG *ret_len; __wine_jmp_buf jmpbuf; NTSTATUS status; + void *teb_frame; };
/*********************************************************************** @@ -756,6 +757,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void callback_frame.frame.restore_flags = CONTEXT_INTEGER; callback_frame.frame.syscall_table = frame->syscall_table; callback_frame.frame.prev_frame = frame; + callback_frame.teb_frame = NtCurrentTeb()->Tib.ExceptionList; arm_thread_data()->syscall_frame = &callback_frame.frame;
__wine_syscall_dispatcher_return( &callback_frame.frame, 0 ); @@ -777,6 +779,7 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status *frame->ret_len = ret_len; frame->status = status; arm_thread_data()->syscall_frame = frame->frame.prev_frame; + NtCurrentTeb()->Tib.ExceptionList = frame->teb_frame; __wine_longjmp( &frame->jmpbuf, 1 ); }
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 10543322a8f..4e552e0f10a 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -730,6 +730,7 @@ struct user_callback_frame ULONG *ret_len; __wine_jmp_buf jmpbuf; NTSTATUS status; + void *teb_frame; };
/*********************************************************************** @@ -766,6 +767,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void callback_frame.frame.restore_flags = CONTEXT_INTEGER; callback_frame.frame.syscall_table = frame->syscall_table; callback_frame.frame.prev_frame = frame; + callback_frame.teb_frame = NtCurrentTeb()->Tib.ExceptionList; arm64_thread_data()->syscall_frame = &callback_frame.frame;
__wine_syscall_dispatcher_return( &callback_frame.frame, 0 ); @@ -787,6 +789,7 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status *frame->ret_len = ret_len; frame->status = status; arm64_thread_data()->syscall_frame = frame->frame.prev_frame; + NtCurrentTeb()->Tib.ExceptionList = frame->teb_frame; __wine_longjmp( &frame->jmpbuf, 1 ); }
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index 5ddef2701c4..2dfce706394 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -1575,6 +1575,7 @@ struct user_callback_frame ULONG *ret_len; __wine_jmp_buf jmpbuf; NTSTATUS status; + void *teb_frame; };
/*********************************************************************** @@ -1614,6 +1615,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void callback_frame.frame.syscall_flags = frame->syscall_flags; callback_frame.frame.syscall_table = frame->syscall_table; callback_frame.frame.prev_frame = frame; + callback_frame.teb_frame = NtCurrentTeb()->Tib.ExceptionList; x86_thread_data()->syscall_frame = &callback_frame.frame;
__wine_syscall_dispatcher_return( &callback_frame.frame, 0 ); @@ -1635,6 +1637,7 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status *frame->ret_len = ret_len; frame->status = status; x86_thread_data()->syscall_frame = frame->frame.prev_frame; + NtCurrentTeb()->Tib.ExceptionList = frame->teb_frame; __wine_longjmp( &frame->jmpbuf, 1 ); }
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 9b7a19bce72..d6f19dbfa84 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2327,6 +2327,7 @@ struct user_callback_frame ULONG *ret_len; __wine_jmp_buf jmpbuf; NTSTATUS status; + void *teb_frame; };
/*********************************************************************** @@ -2368,6 +2369,7 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void callback_frame.frame.prev_frame = frame; callback_frame.frame.syscall_flags = frame->syscall_flags; callback_frame.frame.syscall_table = frame->syscall_table; + callback_frame.teb_frame = NtCurrentTeb()->Tib.ExceptionList; amd64_thread_data()->syscall_frame = &callback_frame.frame;
__wine_syscall_dispatcher_return( &callback_frame.frame, 0 ); @@ -2389,6 +2391,7 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status *frame->ret_len = ret_len; frame->status = status; amd64_thread_data()->syscall_frame = frame->frame.prev_frame; + NtCurrentTeb()->Tib.ExceptionList = frame->teb_frame; __wine_longjmp( &frame->jmpbuf, 1 ); }