diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index d9fa8f4413..4edf777343 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -92,6 +92,15 @@ Thread::~Thread() if (selector()) gdt_free_entry(selector()); + + if (m_userspace_stack_region) + m_process.deallocate_region(*m_userspace_stack_region); + + if (m_kernel_stack_region) + m_process.deallocate_region(*m_kernel_stack_region); + + if (m_kernel_stack_for_signal_handler_region) + m_process.deallocate_region(*m_kernel_stack_for_signal_handler_region); } void Thread::unblock() @@ -503,9 +512,9 @@ void Thread::make_userspace_stack_for_main_thread(Vector arguments, Vect void Thread::make_userspace_stack_for_secondary_thread(void* argument) { - auto* region = m_process.allocate_region(VirtualAddress(), default_userspace_stack_size, String::format("Stack (Thread %d)", tid())); - ASSERT(region); - m_tss.esp = region->vaddr().offset(default_userspace_stack_size).get(); + m_userspace_stack_region = m_process.allocate_region(VirtualAddress(), default_userspace_stack_size, String::format("Stack (Thread %d)", tid())); + ASSERT(m_userspace_stack_region); + m_tss.esp = m_userspace_stack_region->vaddr().offset(default_userspace_stack_size).get(); // NOTE: The stack needs to be 16-byte aligned. push_value_on_stack((u32)argument); diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 74b1c417d6..4bfa72e11a 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -326,6 +326,7 @@ private: u32 m_pending_signals { 0 }; u32 m_signal_mask { 0 }; u32 m_kernel_stack_base { 0 }; + RefPtr m_userspace_stack_region; RefPtr m_kernel_stack_region; RefPtr m_kernel_stack_for_signal_handler_region; SignalActionData m_signal_action_data[32];