Fix directed pickup deadlock bug (bug #5270)
authorMark Spencer <markster@digium.com>
Sat, 24 Sep 2005 14:22:12 +0000 (14:22 +0000)
committerMark Spencer <markster@digium.com>
Sat, 24 Sep 2005 14:22:12 +0000 (14:22 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6634 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_directed_pickup.c

index 53f3964..e9282d2 100755 (executable)
@@ -51,7 +51,7 @@ LOCAL_USER_DECL;
 
 static int pickup_exec(struct ast_channel *chan, void *data)
 {
 
 static int pickup_exec(struct ast_channel *chan, void *data)
 {
-       int res = -1;
+       int res = 0;
        struct localuser *u = NULL;
        struct ast_channel *origin = NULL, *target = NULL;
        char *tmp = NULL, *exten = NULL, *context = NULL;
        struct localuser *u = NULL;
        struct ast_channel *origin = NULL, *target = NULL;
        char *tmp = NULL, *exten = NULL, *context = NULL;
@@ -100,6 +100,7 @@ static int pickup_exec(struct ast_channel *chan, void *data)
                if (res) {
                        ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
                        res = -1;
                if (res) {
                        ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
                        res = -1;
+                       ast_mutex_unlock(&target->lock);
                        goto out;
                }
                res = ast_queue_control(chan, AST_CONTROL_ANSWER);
                        goto out;
                }
                res = ast_queue_control(chan, AST_CONTROL_ANSWER);
@@ -107,12 +108,14 @@ static int pickup_exec(struct ast_channel *chan, void *data)
                        ast_log(LOG_WARNING, "Unable to queue answer on '%s'\n",
                                chan->name);
                        res = -1;
                        ast_log(LOG_WARNING, "Unable to queue answer on '%s'\n",
                                chan->name);
                        res = -1;
+                       ast_mutex_unlock(&target->lock);
                        goto out;
                }
                res = ast_channel_masquerade(target, chan);
                if (res) {
                        ast_log(LOG_WARNING, "Unable to masquerade '%s' into '%s'\n", chan->name, target->name);
                        res = -1;
                        goto out;
                }
                res = ast_channel_masquerade(target, chan);
                if (res) {
                        ast_log(LOG_WARNING, "Unable to masquerade '%s' into '%s'\n", chan->name, target->name);
                        res = -1;
+                       ast_mutex_unlock(&target->lock);
                        goto out;
                }
                /* Done */
                        goto out;
                }
                /* Done */