threadpool: Fix potential data race.
authorCorey Farrell <git@cfware.com>
Fri, 12 Feb 2016 15:59:44 +0000 (10:59 -0500)
committerCorey Farrell <git@cfware.com>
Tue, 24 May 2016 20:40:21 +0000 (15:40 -0500)
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

index 60e1e9a..9cd33ab 100644 (file)
@@ -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);
        }