Bläddra i källkod

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.
Brian Gianforcaro 4 år sedan
förälder
incheckning
bb91bed576
3 ändrade filer med 9 tillägg och 6 borttagningar
  1. 4 4
      Kernel/ProcessGroup.cpp
  2. 2 2
      Kernel/ProcessGroup.h
  3. 3 0
      Kernel/Syscalls/setpgid.cpp

+ 4 - 4
Kernel/ProcessGroup.cpp

@@ -17,10 +17,10 @@ ProcessGroup::~ProcessGroup()
     g_process_groups->remove(this);
 }
 
-NonnullRefPtr<ProcessGroup> ProcessGroup::create(ProcessGroupID pgid)
+RefPtr<ProcessGroup> 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> ProcessGroup::create(ProcessGroupID pgid)
     return process_group;
 }
 
-NonnullRefPtr<ProcessGroup> ProcessGroup::find_or_create(ProcessGroupID pgid)
+RefPtr<ProcessGroup> ProcessGroup::find_or_create(ProcessGroupID pgid)
 {
     ScopedSpinLock lock(g_process_groups_lock);
 

+ 2 - 2
Kernel/ProcessGroup.h

@@ -28,8 +28,8 @@ class ProcessGroup
 public:
     ~ProcessGroup();
 
-    static NonnullRefPtr<ProcessGroup> create(ProcessGroupID);
-    static NonnullRefPtr<ProcessGroup> find_or_create(ProcessGroupID);
+    static RefPtr<ProcessGroup> create(ProcessGroupID);
+    static RefPtr<ProcessGroup> find_or_create(ProcessGroupID);
     static RefPtr<ProcessGroup> from_pgid(ProcessGroupID);
 
     const ProcessGroupID& pgid() const { return m_pgid; }

+ 3 - 0
Kernel/Syscalls/setpgid.cpp

@@ -116,6 +116,9 @@ KResultOr<int> 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;
 }