diff --git a/Kernel/ProcessGroup.cpp b/Kernel/ProcessGroup.cpp index 938b41152f..3a92151e51 100644 --- a/Kernel/ProcessGroup.cpp +++ b/Kernel/ProcessGroup.cpp @@ -17,10 +17,10 @@ ProcessGroup::~ProcessGroup() g_process_groups->remove(this); } -NonnullRefPtr ProcessGroup::create(ProcessGroupID pgid) +RefPtr ProcessGroup::create(ProcessGroupID pgid) { - auto process_group = adopt_ref(*new ProcessGroup(pgid)); - { + auto process_group = adopt_ref_if_nonnull(new ProcessGroup(pgid)); + if (process_group) { ScopedSpinLock lock(g_process_groups_lock); g_process_groups->prepend(process_group); } @@ -28,7 +28,7 @@ NonnullRefPtr ProcessGroup::create(ProcessGroupID pgid) return process_group; } -NonnullRefPtr ProcessGroup::find_or_create(ProcessGroupID pgid) +RefPtr ProcessGroup::find_or_create(ProcessGroupID pgid) { ScopedSpinLock lock(g_process_groups_lock); diff --git a/Kernel/ProcessGroup.h b/Kernel/ProcessGroup.h index 45fb4b38fa..8ae5f295f5 100644 --- a/Kernel/ProcessGroup.h +++ b/Kernel/ProcessGroup.h @@ -28,8 +28,8 @@ class ProcessGroup public: ~ProcessGroup(); - static NonnullRefPtr create(ProcessGroupID); - static NonnullRefPtr find_or_create(ProcessGroupID); + static RefPtr create(ProcessGroupID); + static RefPtr find_or_create(ProcessGroupID); static RefPtr from_pgid(ProcessGroupID); const ProcessGroupID& pgid() const { return m_pgid; } diff --git a/Kernel/Syscalls/setpgid.cpp b/Kernel/Syscalls/setpgid.cpp index 3398bcca70..e81baf3051 100644 --- a/Kernel/Syscalls/setpgid.cpp +++ b/Kernel/Syscalls/setpgid.cpp @@ -116,6 +116,9 @@ KResultOr Process::sys$setpgid(pid_t specified_pid, pid_t specified_pgid) } // FIXME: There are more EPERM conditions to check for here.. process->m_pg = ProcessGroup::find_or_create(new_pgid); + if (!process->m_pg) { + return ENOMEM; + } return 0; }