diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index cad0a7c5f5..06828ac60b 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2063,6 +2063,21 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p return 0; } + if (session->inv_session->state >= PJSIP_INV_STATE_CONFIRMED) { + /* Weird case. We've received a reinvite but we don't have a channel. The most + * typical case for this happening is that a blind transfer fails, and so the + * transferer attempts to reinvite himself back into the call. We already got + * rid of that channel, and the other side of the call is unrecoverable. + * + * We treat this as a failure, so our best bet is to just hang this call + * up and not create a new channel. Clearing defer_terminate here ensures that + * calling ast_sip_session_terminate() can result in a BYE being sent ASAP. + */ + session->defer_terminate = 0; + ast_sip_session_terminate(session, 400); + return -1; + } + datastore = ast_sip_session_alloc_datastore(&transport_info, "transport_info"); if (!datastore) { return -1; diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 606097700f..d659684b9d 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -779,7 +779,8 @@ static pj_bool_t session_reinvite_on_rx_request(pjsip_rx_data *rdata) if (rdata->msg_info.msg->line.req.method.id != PJSIP_INVITE_METHOD || !(dlg = pjsip_ua_find_dialog(&rdata->msg_info.cid->id, &rdata->msg_info.to->tag, &rdata->msg_info.from->tag, PJ_FALSE)) || - !(session = ast_sip_dialog_get_session(dlg))) { + !(session = ast_sip_dialog_get_session(dlg)) || + !session->channel) { return PJ_FALSE; }