From cd42ccd686423975020ef50a48cda3877de1bab7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 6 Jan 2020 14:31:54 +0100 Subject: [PATCH] Kernel: The waitpid() syscall was not storing to "wstatus" in all cases --- Kernel/Process.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 5e202ef373..2fad5451b6 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1981,7 +1981,7 @@ pid_t Process::sys$waitpid(pid_t waitee, int* wstatus, int options) if (wstatus && !validate_write_typed(wstatus)) return -EFAULT; - int exit_status; + int exit_status = 0; { InterruptDisabler disabler; @@ -2001,8 +2001,6 @@ pid_t Process::sys$waitpid(pid_t waitee, int* wstatus, int options) } return IterationDecision::Continue; }); - if (wstatus) - copy_to_user(wstatus, &exit_status, sizeof(exit_status)); return reaped_pid; } else { ASSERT(waitee > 0); // FIXME: Implement other PID specs. @@ -2036,6 +2034,9 @@ pid_t Process::sys$waitpid(pid_t waitee, int* wstatus, int options) ASSERT(waitee_process->any_thread().state() == Thread::State::Stopped); exit_status = 0x7f; } + + if (wstatus) + copy_to_user(wstatus, &exit_status, sizeof(exit_status)); return waitee_pid; }