Kaynağa Gözat

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.
Andreas Kling 3 yıl önce
ebeveyn
işleme
8ad46fd8f5
1 değiştirilmiş dosya ile 6 ekleme ve 0 silme
  1. 6 0
      Kernel/Syscalls/execve.cpp

+ 6 - 0
Kernel/Syscalls/execve.cpp

@@ -840,6 +840,12 @@ ErrorOr<void> Process::exec(NonnullOwnPtr<KString> path, NonnullOwnPtrVector<KSt
 
 
     auto* current_thread = Thread::current();
     auto* current_thread = Thread::current();
     if (current_thread == new_main_thread) {
     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
         // We need to enter the scheduler lock before changing the state
         // and it will be released after the context switch into that
         // and it will be released after the context switch into that
         // thread. We should also still be in our critical section
         // thread. We should also still be in our critical section