]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Deadlock between generic CCSS agent and native ISDN CCSS.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 16 May 2011 20:33:37 +0000 (20:33 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 16 May 2011 20:33:37 +0000 (20:33 +0000)
Deadlock can occur when the generic CCSS agent is deleting duplicate CC
offers and the native ISDN CC driver is processing an incoming CC message.
The cc_core_instances container lock cannot be held when an agent or
monitor callback is invoked without the possibility of a deadlock.

* Make kill_duplicate_offers() remove the reference in cc_core_instances
outside of the container lock.

JIRA AST-566
JIRA SWP-3469

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@319259 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/ccss.c

index c3383fba2de680569b594e3cbb1a09d614ee532c..b292771e084fc454a80951823f1c9bf369c2f7f6 100644 (file)
@@ -2226,7 +2226,18 @@ static long count_agents(const char * const caller, const int core_id_exception)
 static void kill_duplicate_offers(char *caller)
 {
        unsigned long match_flags = MATCH_NO_REQUEST;
-       ao2_t_callback_data(cc_core_instances, OBJ_UNLINK | OBJ_NODATA, match_agent, caller, &match_flags, "Killing duplicate offers");
+       struct ao2_iterator *dups_iter;
+
+       /*
+        * Must remove the ref that was in cc_core_instances outside of
+        * the container lock to prevent deadlock.
+        */
+       dups_iter = ao2_t_callback_data(cc_core_instances, OBJ_MULTIPLE | OBJ_UNLINK,
+               match_agent, caller, &match_flags, "Killing duplicate offers");
+       if (dups_iter) {
+               /* Now actually unref any duplicate offers by simply destroying the iterator. */
+               ao2_iterator_destroy(dups_iter);
+       }
 }
 
 static void check_callback_sanity(const struct ast_cc_agent_callbacks *callbacks)