From e793501084839b1988fa0168c41bf92bdc59a2be Mon Sep 17 00:00:00 2001
From: Richard Mudgett <rmudgett@digium.com>
Date: Thu, 9 Nov 2017 19:58:12 -0600
Subject: [PATCH] chan_pjsip.c: Improve answer failure log messages.

* Balanced the session->inv_session refs on answer failure.

Change-Id: I33542d639d37e692cb46550b972a5fcfc3b804b8
---
 channels/chan_pjsip.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 0160425e62..e4e8fa586b 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -672,7 +672,19 @@ static int answer(void *data)
 	pjsip_inv_dec_ref(session->inv_session);
 #endif
 
-	return (status == PJ_SUCCESS) ? 0 : -1;
+	if (status != PJ_SUCCESS) {
+		char err[PJ_ERR_MSG_SIZE];
+
+		pj_strerror(status, err, sizeof(err));
+		ast_log(LOG_WARNING,"Cannot answer '%s': %s\n",
+			ast_channel_name(session->channel), err);
+		/*
+		 * Return this value so we can distinguish between this
+		 * failure and the threadpool synchronous push failing.
+		 */
+		return -2;
+	}
+	return 0;
 }
 
 /*! \brief Function called by core when we should answer a PJSIP session */
@@ -680,6 +692,7 @@ static int chan_pjsip_answer(struct ast_channel *ast)
 {
 	struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
 	struct ast_sip_session *session;
+	int res;
 
 	if (ast_channel_state(ast) == AST_STATE_UP) {
 		return 0;
@@ -700,11 +713,15 @@ static int chan_pjsip_answer(struct ast_channel *ast)
 	   can occur between this thread and bridging (specifically when native bridging
 	   attempts to do direct media) */
 	ast_channel_unlock(ast);
-	if (ast_sip_push_task_synchronous(session->serializer, answer, session)) {
-		ast_log(LOG_WARNING, "Unable to push answer task to the threadpool. Cannot answer call\n");
+	res = ast_sip_push_task_synchronous(session->serializer, answer, session);
+	if (res) {
+		if (res == -1) {
+			ast_log(LOG_ERROR,"Cannot answer '%s': Unable to push answer task to the threadpool.\n",
+				ast_channel_name(session->channel));
 #ifdef HAVE_PJSIP_INV_SESSION_REF
-		pjsip_inv_dec_ref(session->inv_session);
+			pjsip_inv_dec_ref(session->inv_session);
 #endif
+		}
 		ao2_ref(session, -1);
 		ast_channel_lock(ast);
 		return -1;
-- 
GitLab