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
This commit is contained in:
parent
56f24345f7
commit
80ff2c2540
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue