diff --git a/channel.c b/channel.c index 89ebcbb4b30ca8565365442af6dae1fb79b924c4..dd2b814292aec4ee6b748ad099eded150e36796d 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 ddb4d8a6ec7288cbaa3caa68cf919d1dd49a271f..805c571d5840fea44d5eb39637cbce4eaff88ab1 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; }