From 29035b55b25461a882b3f4d36d59ba5b3f3a201a Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Tue, 11 Aug 2020 15:53:02 +0430 Subject: [PATCH] Kernel: Allow moving a process to a new pgrp via setpgid() --- Kernel/Syscalls/setpgid.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Kernel/Syscalls/setpgid.cpp b/Kernel/Syscalls/setpgid.cpp index 457f44e7ed..3e8a09cd43 100644 --- a/Kernel/Syscalls/setpgid.cpp +++ b/Kernel/Syscalls/setpgid.cpp @@ -124,10 +124,15 @@ int Process::sys$setpgid(pid_t specified_pid, pid_t specified_pgid) ProcessGroupID new_pgid = specified_pgid ? ProcessGroupID(specified_pgid) : process->m_pid.value(); SessionID current_sid = sid(); SessionID new_sid = get_sid_from_pgid(new_pgid); - if (current_sid != new_sid) { + if (new_sid != -1 && current_sid != new_sid) { // Can't move a process between sessions. return -EPERM; } + if (new_sid == -1 && new_pgid != process->m_pid.value()) { + // The value of the pgid argument is valid, but is not + // the calling pid, and is not an existing process group. + return -EPERM; + } // FIXME: There are more EPERM conditions to check for here.. process->m_pgid = new_pgid; return 0;