Module: wine Branch: master Commit: fd60406e91aab94033ad62dc3e00fe9a1a2d6aa6 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd60406e91aab94033ad62dc3...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Oct 3 20:54:26 2019 +0200
ntdll: Try to handle write watches while we're on the signal stack (x86_64).
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/signal_x86_64.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index d8fcc54743..6508654e77 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -2876,6 +2876,15 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext ) struct stack_layout *stack; ucontext_t *ucontext = sigcontext;
+ stack = (struct stack_layout *)(RSP_sig(ucontext) & ~15); + + /* check for exceptions on the signal stack caused by write watches */ + if (TRAP_sig(ucontext) == TRAP_x86_PAGEFLT && is_inside_signal_stack( stack ) && + !virtual_handle_fault( siginfo->si_addr, (ERROR_sig(ucontext) >> 1) & 0x09, TRUE )) + { + return; + } + /* check for page fault inside the thread stack */ if (TRAP_sig(ucontext) == TRAP_x86_PAGEFLT) {