From 7316abeb8f4864bbaa0f26a557055d1af8d3a455 Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Sat, 18 May 2013 22:49:14 +0000
Subject: [PATCH] Fix a bug where synchronous origination (oddly enough
 triggered by doing an async manager Originate) would not work properly.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@389085 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/pbx.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/main/pbx.c b/main/pbx.c
index 3acee2d404..41a46fefe0 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -9963,10 +9963,11 @@ static void pbx_outgoing_destroy(void *obj)
 static void *pbx_outgoing_exec(void *data)
 {
 	RAII_VAR(struct pbx_outgoing *, outgoing, data, ao2_cleanup);
-	enum ast_dial_result res = ast_dial_run(outgoing->dial, NULL, 0);
+	enum ast_dial_result res;
 
 	/* Notify anyone interested that dialing is complete */
 	ast_mutex_lock(&outgoing->lock);
+	res = ast_dial_run(outgoing->dial, NULL, 0);
 	outgoing->dialed = 1;
 	ast_cond_signal(&outgoing->cond);
 	ast_mutex_unlock(&outgoing->lock);
@@ -9976,6 +9977,7 @@ static void *pbx_outgoing_exec(void *data)
 		return NULL;
 	}
 
+	ast_mutex_lock(&outgoing->lock);
 	if (!ast_strlen_zero(outgoing->app)) {
 		struct ast_app *app = pbx_findapp(outgoing->app);
 
@@ -10010,7 +10012,6 @@ static void *pbx_outgoing_exec(void *data)
 	}
 
 	/* Notify anyone else again that may be interested that execution is complete */
-	ast_mutex_lock(&outgoing->lock);
 	outgoing->executed = 1;
 	ast_cond_signal(&outgoing->cond);
 	ast_mutex_unlock(&outgoing->lock);
@@ -10126,9 +10127,15 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, co
 	/* Wait for dialing to complete */
 	if (synchronous) {
 		ast_mutex_lock(&outgoing->lock);
+		if (channel) {
+			ast_channel_unlock(*channel);
+		}
 		while (!outgoing->dialed) {
 			ast_cond_wait(&outgoing->cond, &outgoing->lock);
 		}
+		if (channel) {
+			ast_channel_lock(*channel);
+		}
 		ast_mutex_unlock(&outgoing->lock);
 	}
 
-- 
GitLab