From 80ff2c2540544123b1cf040f1a651cbde4ab4e14 Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Fri, 12 Feb 2016 10:59:44 -0500 Subject: threadpool: Fix potential data race. worker_start checked for ZOMBIE status without holding a lock. All other read/write of worker status are performed with a lock, so this check should do the same. ASTERISK-25777 #close Change-Id: I5e33685a5c26fdb300851989a3b82be8c4e03781 --- main/threadpool.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'main/threadpool.c') diff --git a/main/threadpool.c b/main/threadpool.c index 60e1e9a3b..9cd33ab1a 100644 --- a/main/threadpool.c +++ b/main/threadpool.c @@ -1012,6 +1012,7 @@ static void worker_thread_destroy(void *obj) static void *worker_start(void *arg) { struct worker_thread *worker = arg; + enum worker_state saved_state; if (worker->options.thread_start) { worker->options.thread_start(); @@ -1027,6 +1028,7 @@ static void *worker_start(void *arg) } threadpool_active_thread_idle(worker->pool, worker); } + saved_state = worker->state; ast_mutex_unlock(&worker->lock); /* Reaching this portion means the thread is @@ -1037,7 +1039,7 @@ static void *worker_start(void *arg) * that the thread can be removed from the * list of zombie threads. */ - if (worker->state == ZOMBIE) { + if (saved_state == ZOMBIE) { threadpool_zombie_thread_dead(worker->pool, worker); } -- cgit v1.2.3