diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index cccea564dc4..ec2fdb064f3 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1554,6 +1554,9 @@ pid_t Process::sys$waitpid(pid_t waitee, int* wstatus, int options) // NOTE: If waitee was -1, m_waitee_pid will have been filled in by the scheduler. Process* waitee_process = Process::from_pid(waitee_pid); + if (!waitee_process) + return -ECHILD; + ASSERT(waitee_process); if (waitee_process->is_dead()) { exit_status = reap(*waitee_process); diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index 6e56b97b007..fe8c6459a66 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -195,6 +195,11 @@ Thread::WaitBlocker::WaitBlocker(int wait_options, pid_t& waitee_pid) bool Thread::WaitBlocker::should_unblock(Thread& thread, time_t, long) { bool should_unblock = false; + if (m_waitee_pid != -1) { + auto* peer = Process::from_pid(m_waitee_pid); + if (!peer) + return true; + } thread.process().for_each_child([&](Process& child) { if (m_waitee_pid != -1 && m_waitee_pid != child.pid()) return IterationDecision::Continue;