diff options
author | Mark Spencer <markster@digium.com> | 2004-06-23 17:41:51 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2004-06-23 17:41:51 +0000 |
commit | 68248b91f0685209bcb14c95e0169c7a45e7e4e1 (patch) | |
tree | bd1b4b1c89557fc6a0f8566532b95fc5ca12d287 /channel.c | |
parent | 6729301b4d478259b16a2ce2e3b60fa9a9c5c9dd (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-x | channel.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -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; } |