Browse Source

Kernel: Ensure jailed processes can be reaped by a jailed parent process

We were detaching from the jail process list too early. To ensure we
detach properly, leverage the remove_from_secondary_lists method
so the possibly jailed parent process can still see the dying process
and therefore clean it properly.
Liav A 2 years ago
parent
commit
5a94e8dfd0
2 changed files with 13 additions and 7 deletions
  1. 11 7
      Kernel/Process.cpp
  2. 2 0
      Kernel/Process.h

+ 11 - 7
Kernel/Process.cpp

@@ -785,13 +785,6 @@ void Process::finalize()
     m_fds.with_exclusive([](auto& fds) { fds.clear(); });
     m_fds.with_exclusive([](auto& fds) { fds.clear(); });
     with_mutable_protected_data([&](auto& protected_data) { protected_data.tty = nullptr; });
     with_mutable_protected_data([&](auto& protected_data) { protected_data.tty = nullptr; });
     m_executable.with([](auto& executable) { executable = nullptr; });
     m_executable.with([](auto& executable) { executable = nullptr; });
-    m_jail_process_list.with([this](auto& list_ptr) {
-        if (list_ptr) {
-            list_ptr->attached_processes().with([&](auto& list) {
-                list.remove(*this);
-            });
-        }
-    });
     m_attached_jail.with([](auto& jail) {
     m_attached_jail.with([](auto& jail) {
         if (jail)
         if (jail)
             jail->detach({});
             jail->detach({});
@@ -845,6 +838,17 @@ void Process::unblock_waiters(Thread::WaitBlocker::UnblockFlags flags, u8 signal
         waiter_process->m_wait_blocker_set.unblock(*this, flags, signal);
         waiter_process->m_wait_blocker_set.unblock(*this, flags, signal);
 }
 }
 
 
+void Process::remove_from_secondary_lists()
+{
+    m_jail_process_list.with([this](auto& list_ptr) {
+        if (list_ptr) {
+            list_ptr->attached_processes().with([&](auto& list) {
+                list.remove(*this);
+            });
+        }
+    });
+}
+
 void Process::die()
 void Process::die()
 {
 {
     auto expected = State::Running;
     auto expected = State::Running;

+ 2 - 0
Kernel/Process.h

@@ -204,6 +204,8 @@ public:
 
 
     ~Process();
     ~Process();
 
 
+    virtual void remove_from_secondary_lists();
+
     ErrorOr<NonnullRefPtr<Thread>> create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true);
     ErrorOr<NonnullRefPtr<Thread>> create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true);
 
 
     bool is_profiling() const { return m_profiling; }
     bool is_profiling() const { return m_profiling; }