diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 3d74cf4dee..497025a9c2 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -334,7 +334,10 @@ void Process::crash(int signal, u32 eip, bool out_of_memory) } dump_backtrace(); } - m_termination_signal = signal; + { + ProtectedDataMutationScope scope { *this }; + m_termination_signal = signal; + } set_dump_core(!out_of_memory); space().dump_regions(); VERIFY(is_user_process()); @@ -578,8 +581,11 @@ void Process::terminate_due_to_signal(u8 signal) VERIFY(signal < 32); VERIFY(Process::current() == this); dbgln("Terminating {} due to signal {}", *this, signal); - m_termination_status = 0; - m_termination_signal = signal; + { + ProtectedDataMutationScope scope { *this }; + m_termination_status = 0; + m_termination_signal = signal; + } die(); } diff --git a/Kernel/Process.h b/Kernel/Process.h index a1f37a3d93..3b043d4b3e 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -121,6 +121,8 @@ protected: VirtualAddress m_signal_trampoline; Atomic m_thread_count { 0 }; IntrusiveList m_thread_list; + u8 m_termination_status { 0 }; + u8 m_termination_signal { 0 }; }; class ProcessBase : public ProtectedProcessBase { @@ -579,8 +581,6 @@ private: }; Vector m_fds; - u8 m_termination_status { 0 }; - u8 m_termination_signal { 0 }; mutable RecursiveSpinLock m_thread_list_lock; const bool m_is_kernel_process; diff --git a/Kernel/Syscalls/exit.cpp b/Kernel/Syscalls/exit.cpp index 78fcd4cd04..616f0563be 100644 --- a/Kernel/Syscalls/exit.cpp +++ b/Kernel/Syscalls/exit.cpp @@ -31,8 +31,11 @@ namespace Kernel { void Process::sys$exit(int status) { - m_termination_status = status; - m_termination_signal = 0; + { + ProtectedDataMutationScope scope { *this }; + m_termination_status = status; + m_termination_signal = 0; + } die(); Thread::current()->die_if_needed(); VERIFY_NOT_REACHED();