From 68248b91f0685209bcb14c95e0169c7a45e7e4e1 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Wed, 23 Jun 2004 17:41:51 +0000
Subject: [PATCH] Be sure to hold lock during answer

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3286 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channel.c           | 8 +++++---
 channels/chan_sip.c | 3 ++-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/channel.c b/channel.c
index 89ebcbb4b3..dd2b814292 100755
--- a/channel.c
+++ b/channel.c
@@ -750,16 +750,17 @@ void ast_channel_unregister(char *type)
 int ast_answer(struct ast_channel *chan)
 {
 	int res = 0;
+	ast_mutex_lock(&chan->lock);
 	/* Stop if we're a zombie or need a soft hangup */
-	if (chan->zombie || ast_check_hangup(chan)) 
+	if (chan->zombie || ast_check_hangup(chan)) {
+		ast_mutex_unlock(&chan->lock);
 		return -1;
+	}
 	switch(chan->_state) {
 	case AST_STATE_RINGING:
 	case AST_STATE_RING:
-		ast_mutex_lock(&chan->lock);
 		if (chan->pvt->answer)
 			res = chan->pvt->answer(chan);
-		ast_mutex_unlock(&chan->lock);
 		ast_setstate(chan, AST_STATE_UP);
 		if (chan->cdr)
 			ast_cdr_answer(chan->cdr);
@@ -770,6 +771,7 @@ int ast_answer(struct ast_channel *chan)
 			ast_cdr_answer(chan->cdr);
 		break;
 	}
+	ast_mutex_unlock(&chan->lock);
 	return 0;
 }
 
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index ddb4d8a6ec..805c571d58 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1597,7 +1597,7 @@ static int sip_answer(struct ast_channel *ast)
 	char *codec;
 	struct sip_pvt *p = ast->pvt->pvt;
 
-	
+	ast_mutex_lock(&p->lock);
 	if (ast->_state != AST_STATE_UP) {
 	
 	
@@ -1616,6 +1616,7 @@ static int sip_answer(struct ast_channel *ast)
 			ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
 		res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
 	}
+	ast_mutex_unlock(&p->lock);
 	return res;
 }
 
-- 
GitLab