From 9fac03b84c08bc5a453f04e87b892ccf408ee9c2 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 26 Aug 2024 06:38:29 -0400 Subject: [PATCH] Fix use-after-free in `thread.Pool` --- core/thread/thread_pool.odin | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index da5e116ff..7e2489013 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -175,10 +175,12 @@ pool_stop_task :: proc(pool: ^Pool, user_index: int, exit_code: int = 1) -> bool intrinsics.atomic_sub(&pool.num_outstanding, 1) intrinsics.atomic_sub(&pool.num_in_processing, 1) + old_thread_user_index := t.user_index + destroy(t) replacement := create(pool_thread_runner) - replacement.user_index = t.user_index + replacement.user_index = old_thread_user_index replacement.data = data data.task = {} pool.threads[i] = replacement @@ -207,10 +209,12 @@ pool_stop_all_tasks :: proc(pool: ^Pool, exit_code: int = 1) { intrinsics.atomic_sub(&pool.num_outstanding, 1) intrinsics.atomic_sub(&pool.num_in_processing, 1) + old_thread_user_index := t.user_index + destroy(t) replacement := create(pool_thread_runner) - replacement.user_index = t.user_index + replacement.user_index = old_thread_user_index replacement.data = data data.task = {} pool.threads[i] = replacement