summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-01-13 16:09:52 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-13 16:15:37 +0100
commit8ad46fd8f5a07c49d1a2cd40d22d748599f486e5 (patch)
tree7613772d5edcd67413fe87650f450de1b03f68ed /Kernel
parent611733af0d94bfb48893e7ff8a901f0900eab7fb (diff)
downloadserenity-8ad46fd8f5a07c49d1a2cd40d22d748599f486e5.zip
Kernel: Stop leaking executable path in successful sys$execve()
Since we don't return from sys$execve() when it's successful, we have to take special care to tear down anything we've allocated. Turns out we were not doing this for the full executable path itself.
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Syscalls/execve.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp
index 55496cb369..a3777541b5 100644
--- a/Kernel/Syscalls/execve.cpp
+++ b/Kernel/Syscalls/execve.cpp
@@ -840,6 +840,12 @@ ErrorOr<void> Process::exec(NonnullOwnPtr<KString> path, NonnullOwnPtrVector<KSt
auto* current_thread = Thread::current();
if (current_thread == new_main_thread) {
+ {
+ // Make sure that `path` gets deleted before we teleport into the new process.
+ // If we don't do this, it will leak (since we never return from this function.)
+ OwnPtr<KString> path_deleter = move(path);
+ }
+
// We need to enter the scheduler lock before changing the state
// and it will be released after the context switch into that
// thread. We should also still be in our critical section