diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 96e62a1715..77e610ac3c 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -489,6 +489,11 @@ static int answer(void *data) pjsip_tx_data *packet = NULL; struct ast_sip_session *session = data; + if (session->inv_session->state == PJSIP_INV_STATE_DISCONNECTED) { + ao2_ref(session, -1); + return 0; + } + pjsip_dlg_inc_lock(session->inv_session->dlg); if (session->inv_session->invite_tsx) { status = pjsip_inv_answer(session->inv_session, 200, NULL, NULL, &packet); @@ -1001,7 +1006,8 @@ static int indicate(void *data) struct ast_sip_session *session = ind_data->session; int response_code = ind_data->response_code; - if (pjsip_inv_answer(session->inv_session, response_code, NULL, NULL, &packet) == PJ_SUCCESS) { + if ((session->inv_session->state != PJSIP_INV_STATE_DISCONNECTED) && + (pjsip_inv_answer(session->inv_session, response_code, NULL, NULL, &packet) == PJ_SUCCESS)) { ast_sip_session_send_response(session, packet); } @@ -1053,6 +1059,10 @@ static int update_connected_line_information(void *data) if ((ast_channel_state(session->channel) != AST_STATE_UP) && (session->inv_session->role == PJSIP_UAS_ROLE)) { int response_code = 0; + if (session->inv_session->state == PJSIP_INV_STATE_DISCONNECTED) { + return 0; + } + if (ast_channel_state(session->channel) == AST_STATE_RING) { response_code = !session->endpoint->inband_progress ? 180 : 183; } else if (ast_channel_state(session->channel) == AST_STATE_RINGING) {