From 985074c790eed1e74dcf5c9bc58d9624c313e6db Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 9 Nov 2018 17:59:14 +0100 Subject: [PATCH] Okay, now *actually* plug the leaks in exec(). I didn't even put the { } properly around everything that would leak. Let's make sure this works correctly by splitting out the work into a helper called do_exec(). --- Kernel/Process.cpp | 14 +++++++++++--- Kernel/Process.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 4c1abb76c3..e63e50fea4 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -288,7 +288,7 @@ pid_t Process::sys$fork(RegisterDump& regs) return child->pid(); } -int Process::exec(const String& path, Vector&& arguments, Vector&& environment) +int Process::do_exec(const String& path, Vector&& arguments, Vector&& environment) { auto parts = path.split('/'); if (parts.isEmpty()) @@ -309,7 +309,6 @@ int Process::exec(const String& path, Vector&& arguments, Vector return -ENOTIMPL; } - { // Put everything into a scope so things get cleaned up before we yield-teleport into the new executable. auto vmo = VMObject::create_file_backed(descriptor->vnode(), descriptor->metadata().size); vmo->set_name(descriptor->absolute_path()); auto* region = allocate_region_with_vmo(LinearAddress(), descriptor->metadata().size, vmo.copyRef(), 0, "helper", true, false); @@ -403,7 +402,16 @@ int Process::exec(const String& path, Vector&& arguments, Vector #endif set_state(Skip1SchedulerPass); - } // Ready to yield-teleport! + return 0; +} + +int Process::exec(const String& path, Vector&& arguments, Vector&& environment) +{ + // The bulk of exec() is done by do_exec(), which ensures that all locals + // are cleaned up by the time we yield-teleport below. + int rc = do_exec(path, move(arguments), move(environment)); + if (rc < 0) + return rc; if (current == this) { Scheduler::yield(); diff --git a/Kernel/Process.h b/Kernel/Process.h index 2cbdc59b19..52a9e25b2e 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -209,6 +209,7 @@ private: Process(String&& name, uid_t, gid_t, pid_t ppid, RingLevel, RetainPtr&& cwd = nullptr, RetainPtr&& executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); + int do_exec(const String& path, Vector&& arguments, Vector&& environment); void push_value_on_stack(dword); PageDirectory* m_page_directory { nullptr };