summaryrefslogtreecommitdiff
path: root/channel.c
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-06-23 17:41:51 +0000
committerMark Spencer <markster@digium.com>2004-06-23 17:41:51 +0000
commit68248b91f0685209bcb14c95e0169c7a45e7e4e1 (patch)
treebd1b4b1c89557fc6a0f8566532b95fc5ca12d287 /channel.c
parent6729301b4d478259b16a2ce2e3b60fa9a9c5c9dd (diff)
Be sure to hold lock during answer
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3286 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channel.c')
-rwxr-xr-xchannel.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/channel.c b/channel.c
index 89ebcbb4b..dd2b81429 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;
}