From 2739cc7c750b6305eb6d05e94fb48e0d5b7b0ea9 Mon Sep 17 00:00:00 2001 From: mmichelson Date: Mon, 27 Aug 2007 22:40:19 +0000 Subject: Resolve a potential deadlock. In this case, a single queue is locked, then the queue list. In changethread(), the queue list is locked, and then each individual queue is locked. Under the right circumstances, this could deadlock. As such, I have unlocked the individual queue before locking the queue list, and then locked the queue back after the queue list is unlocked. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@81158 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_queue.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'apps') diff --git a/apps/app_queue.c b/apps/app_queue.c index 298fab19e..56ab9fc73 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -1106,7 +1106,9 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as } else { q->members = next_m; } + ast_mutex_unlock(&q->lock); remove_from_interfaces(m->interface); + ast_mutex_lock(&q->lock); q->membercount--; free(m); } else { @@ -1160,7 +1162,9 @@ static void update_realtime_members(struct call_queue *q) } else { q->members = next_m; } + ast_mutex_unlock(&q->lock); remove_from_interfaces(m->interface); + ast_mutex_lock(&q->lock); q->membercount--; free(m); } else { -- cgit v1.2.3