From 2a6b492c7fec99a63466652fe81561454e357d8c Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 15 Dec 2023 19:15:57 +0200 Subject: [PATCH] Kernel: Copy over TLS region size and alignment when forking Previously we would unintentionally leave them zero-initialized, resulting in any threads created post fork (but without execve) having invalid thread local storage pointers stored in their FS register. --- Kernel/Syscalls/fork.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp index 145ed369e8..5ccb2e0795 100644 --- a/Kernel/Syscalls/fork.cpp +++ b/Kernel/Syscalls/fork.cpp @@ -168,8 +168,11 @@ ErrorOr Process::sys$fork(RegisterState& regs) TRY(child_space->region_tree().place_specifically(*region_clone, region.range())); auto* child_region = region_clone.leak_ptr(); - if (®ion == m_master_tls_region.unsafe_ptr()) + if (®ion == m_master_tls_region.unsafe_ptr()) { child->m_master_tls_region = TRY(child_region->try_make_weak_ptr()); + child->m_master_tls_size = m_master_tls_size; + child->m_master_tls_alignment = m_master_tls_alignment; + } } return {}; });