From bb91bed576f244bb1ddf2faee64c36b18f644901 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Tue, 18 May 2021 02:07:25 -0700 Subject: [PATCH] Kernel: Make ProcessGroup::find_or_create API OOM safe Make ProcessGroup::find_or_create & ProcessGroup::create OOM safe, by moving to adopt_ref_if_nonnull. --- Kernel/ProcessGroup.cpp | 8 ++++---- Kernel/ProcessGroup.h | 4 ++-- Kernel/Syscalls/setpgid.cpp | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) 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; }