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;
 }