Преглед на файлове

Kernel: Fail process creating earlier if can't create AddressSpace

It makes more sense to fail the Process creation earlier if we can't
create an AddressSpace for the new Process.
Liav A преди 4 години
родител
ревизия
04c2addaa8
променени са 2 файла, в които са добавени 7 реда и са изтрити 7 реда
  1. 6 6
      Kernel/Process.cpp
  2. 1 1
      Kernel/Process.h

+ 6 - 6
Kernel/Process.cpp

@@ -229,10 +229,13 @@ void Process::unprotect_data()
 
 RefPtr<Process> Process::create(RefPtr<Thread>& first_thread, const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty, Process* fork_parent)
 {
+    auto space = Memory::AddressSpace::try_create(fork_parent ? &fork_parent->address_space() : nullptr);
+    if (!space)
+        return {};
     auto process = adopt_ref_if_nonnull(new (nothrow) Process(name, uid, gid, ppid, is_kernel_process, move(cwd), move(executable), tty));
     if (!process)
         return {};
-    auto result = process->attach_resources(first_thread, fork_parent);
+    auto result = process->attach_resources(space.release_nonnull(), first_thread, fork_parent);
     if (result.is_error())
         return {};
     return process;
@@ -261,12 +264,9 @@ Process::Process(const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool
     dbgln_if(PROCESS_DEBUG, "Created new process {}({})", m_name, this->pid().value());
 }
 
-KResult Process::attach_resources(RefPtr<Thread>& first_thread, Process* fork_parent)
+KResult Process::attach_resources(NonnullOwnPtr<Memory::AddressSpace>&& preallocated_space, RefPtr<Thread>& first_thread, Process* fork_parent)
 {
-    m_space = Memory::AddressSpace::try_create(fork_parent ? &fork_parent->address_space() : nullptr);
-    if (!m_space)
-        return ENOMEM;
-
+    m_space = move(preallocated_space);
     if (fork_parent) {
         // NOTE: fork() doesn't clone all threads; the thread that called fork() becomes the only thread in the new process.
         first_thread = Thread::current()->clone(*this);

+ 1 - 1
Kernel/Process.h

@@ -514,7 +514,7 @@ private:
 
     Process(const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty);
     static RefPtr<Process> create(RefPtr<Thread>& first_thread, const String& name, uid_t, gid_t, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
-    KResult attach_resources(RefPtr<Thread>& first_thread, Process* fork_parent);
+    KResult attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, RefPtr<Thread>& first_thread, Process* fork_parent);
     static ProcessID allocate_pid();
 
     void kill_threads_except_self();