From b9d693665b2e75b72a0e2182871d3c33ddfbb122 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 28 May 2021 11:18:58 +0200 Subject: [PATCH] Kernel: Make sure we unmap the TLS region when a thread exits Previously the TLS region would get leaked which was noticible when creating/destroying a lot of threads and then inspecting the region map. --- Kernel/Thread.cpp | 8 ++++++++ Kernel/Thread.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 3939d0d82b..dc5910354c 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -266,6 +266,12 @@ void Thread::exit(void* exit_value) set_should_die(); u32 unlock_count; [[maybe_unused]] auto rc = unlock_process_if_locked(unlock_count); + if (m_thread_specific_range.has_value()) { + auto* region = process().space().find_region_from_range(m_thread_specific_range.value()); + VERIFY(region); + if (!process().space().deallocate_region(*region)) + dbgln("Failed to unmap TLS range, exiting thread anyway."); + } die_if_needed(); } @@ -1021,6 +1027,8 @@ KResult Thread::make_thread_specific_region(Badge) if (region_or_error.is_error()) return region_or_error.error(); + m_thread_specific_range = range.value(); + SmapDisabler disabler; auto* thread_specific_data = (ThreadSpecificData*)region_or_error.value()->vaddr().offset(align_up_to(process().m_master_tls_size, thread_specific_region_alignment())).as_ptr(); auto* thread_local_storage = (u8*)((u8*)thread_specific_data) - align_up_to(process().m_master_tls_size, process().m_master_tls_alignment); diff --git a/Kernel/Thread.h b/Kernel/Thread.h index df3ee93efa..028237538e 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -1220,6 +1221,7 @@ private: u32 m_kernel_stack_top { 0 }; OwnPtr m_kernel_stack_region; VirtualAddress m_thread_specific_data; + Optional m_thread_specific_range; Array m_signal_action_data; Blocker* m_blocker { nullptr };