Fix some bad locking stemming from trying to forward a call to a non-existent
authorMark Michelson <mmichelson@digium.com>
Fri, 12 Jun 2009 15:37:30 +0000 (15:37 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 12 Jun 2009 15:37:30 +0000 (15:37 +0000)
extension from a queue.

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

apps/app_queue.c
channels/chan_local.c

index 8fe2cdc..9227423 100644 (file)
@@ -3178,11 +3178,13 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
 
                                                if (ast_call(o->chan, tmpchan, 0)) {
                                                        ast_log(LOG_NOTICE, "Failed to dial on local channel for call forward to '%s'\n", tmpchan);
+                                                       ast_channel_unlock(o->chan);
                                                        do_hang(o);
                                                        numnochan++;
+                                               } else {
+                                                       ast_channel_unlock(o->chan);
                                                }
                                                ast_channel_unlock(in);
-                                               ast_channel_unlock(o->chan);
                                        }
                                        /* Hangup the original channel now, in case we needed it */
                                        ast_hangup(winner);
index 5eba90f..329b982 100644 (file)
@@ -571,6 +571,8 @@ start_over:
         */
        if (p->owner->cid.cid_rdnis) {
                if (!(p->chan->cid.cid_rdnis = ast_strdup(p->owner->cid.cid_rdnis))) {
+                       ast_mutex_unlock(&p->lock);
+                       ast_channel_unlock(p->chan);
                        return -1;
                }
        }
@@ -578,6 +580,8 @@ start_over:
 
        if (p->owner->cid.cid_dnid) {
                if (!(p->chan->cid.cid_dnid = ast_strdup(p->owner->cid.cid_dnid))) {
+                       ast_mutex_unlock(&p->lock);
+                       ast_channel_unlock(p->chan);
                        return -1;
                }
        }
@@ -595,6 +599,7 @@ start_over:
        if (!ast_exists_extension(NULL, p->chan->context, p->chan->exten, 1, p->owner->cid.cid_num)) {
                ast_log(LOG_NOTICE, "No such extension/context %s@%s while calling Local channel\n", p->chan->exten, p->chan->context);
                ast_mutex_unlock(&p->lock);
+               ast_channel_unlock(p->chan);
                return -1;
        }