]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 211113 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Fri, 7 Aug 2009 20:17:08 +0000 (20:17 +0000)
committerRussell Bryant <russell@russellbryant.com>
Fri, 7 Aug 2009 20:17:08 +0000 (20:17 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r211113 | russell | 2009-08-07 15:12:21 -0500 (Fri, 07 Aug 2009) | 11 lines

  Recorded merge of revisions 211112 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r211112 | russell | 2009-08-07 15:11:31 -0500 (Fri, 07 Aug 2009) | 4 lines

    Resolve a deadlock involving app_chanspy and masquerades.

    (ABE-1936)
  ........
................

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

apps/app_chanspy.c

index ee88d95cac7fa3871bbc4e66227d41413d9aae8e..8340f7e12ce9d323a6fee8059e525b4643ec351e 100644 (file)
@@ -552,17 +552,20 @@ static const struct ast_datastore_info chanspy_ds_info = {
 
 static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds)
 {
-       if (!chanspy_ds)
+       struct ast_channel *chan;
+
+       if (!chanspy_ds) {
                return NULL;
+       }
 
        ast_mutex_lock(&chanspy_ds->lock);
-       if (chanspy_ds->chan) {
+       while ((chan = chanspy_ds->chan)) {
                struct ast_datastore *datastore;
-               struct ast_channel *chan;
-
-               chan = chanspy_ds->chan;
 
-               ast_channel_lock(chan);
+               if (ast_channel_trylock(chan)) {
+                       DEADLOCK_AVOIDANCE(&chanspy_ds->lock);
+                       continue;
+               }
                if ((datastore = ast_channel_datastore_find(chan, &chanspy_ds_info, chanspy_ds->unique_id))) {
                        ast_channel_datastore_remove(chan, datastore);
                        /* chanspy_ds->chan is NULL after this call */
@@ -571,6 +574,7 @@ static struct chanspy_ds *chanspy_ds_free(struct chanspy_ds *chanspy_ds)
                        ast_datastore_free(datastore);
                }
                ast_channel_unlock(chan);
+               break;
        }
        ast_mutex_unlock(&chanspy_ds->lock);