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.
This commit is contained in:
Liav A 2021-08-07 22:40:54 +03:00 committed by Andreas Kling
parent 01b79910b3
commit 04c2addaa8
Notes: sideshowbarker 2024-07-18 07:04:33 +09:00
2 changed files with 7 additions and 7 deletions

View file

@ -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);

View file

@ -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();