From 9e1fcb74a2473d1053435a612586efb76ec72f34 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 5 Mar 2019 11:00:26 +0100 Subject: [PATCH] Kernel: Returning from a signal handler reset the signal mask correctly. We were setting the handled signal number as the new signal mask, oops. --- Kernel/Process.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index dbb0822d1a..2d317a296b 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -970,6 +970,7 @@ ShouldUnblockProcess Process::dispatch_signal(byte signal) auto* region = allocate_region(LinearAddress(), PAGE_SIZE, "signal_trampoline", true, true); m_return_to_ring3_from_signal_trampoline = region->laddr(); byte* code_ptr = m_return_to_ring3_from_signal_trampoline.as_ptr(); + *code_ptr++ = 0x58; // pop eax (Skip over signal argument) *code_ptr++ = 0x5a; // pop edx *code_ptr++ = 0xb8; // mov eax, *(dword*)code_ptr = Syscall::SC_restore_signal_mask; @@ -983,6 +984,7 @@ ShouldUnblockProcess Process::dispatch_signal(byte signal) *code_ptr++ = 0x0b; m_return_to_ring0_from_signal_trampoline = LinearAddress((dword)code_ptr); + *code_ptr++ = 0x58; // pop eax (Skip over signal argument) *code_ptr++ = 0x5a; // pop edx *code_ptr++ = 0xb8; // mov eax, *(dword*)code_ptr = Syscall::SC_restore_signal_mask;