mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
res_pjsip_session: Fix race condition where redirecting information may not be set.
Since the PJSIP INVITE session module is invoked before any session supplements it was possible for it to handle a redirect before the res_pjsip_diversion module interpreted and set redirecting information on the channel. This would cause the redirecting information to get lost. This patch ensures that session supplements are *always* invoked before a redirect occurs by explicitly calling them in the redirect handler. Review: https://reviewboard.asterisk.org/r/3850/ ........ Merged revisions 419764 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@419766 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -55,9 +55,9 @@
|
|||||||
static const pj_str_t *hostname;
|
static const pj_str_t *hostname;
|
||||||
|
|
||||||
/* Some forward declarations */
|
/* Some forward declarations */
|
||||||
static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata);
|
static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type);
|
||||||
static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata);
|
static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type);
|
||||||
static int handle_incoming(struct ast_sip_session *session, pjsip_rx_data *rdata);
|
static int handle_incoming(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type);
|
||||||
static void handle_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
static void handle_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
||||||
static void handle_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
static void handle_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
||||||
static void handle_outgoing(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
static void handle_outgoing(struct ast_sip_session *session, pjsip_tx_data *tdata);
|
||||||
@@ -1571,7 +1571,7 @@ static int new_invite(void *data)
|
|||||||
}
|
}
|
||||||
ast_sip_session_send_response(invite->session, tdata);
|
ast_sip_session_send_response(invite->session, tdata);
|
||||||
|
|
||||||
handle_incoming_request(invite->session, invite->rdata);
|
handle_incoming_request(invite->session, invite->rdata, PJSIP_EVENT_RX_MSG);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1782,7 +1782,7 @@ static void __print_debug_details(const char *function, pjsip_inv_session *inv,
|
|||||||
|
|
||||||
#define print_debug_details(inv, tsx, e) __print_debug_details(__PRETTY_FUNCTION__, (inv), (tsx), (e))
|
#define print_debug_details(inv, tsx, e) __print_debug_details(__PRETTY_FUNCTION__, (inv), (tsx), (e))
|
||||||
|
|
||||||
static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
|
static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type)
|
||||||
{
|
{
|
||||||
struct ast_sip_session_supplement *supplement;
|
struct ast_sip_session_supplement *supplement;
|
||||||
struct pjsip_request_line req = rdata->msg_info.msg->line.req;
|
struct pjsip_request_line req = rdata->msg_info.msg->line.req;
|
||||||
@@ -1797,11 +1797,16 @@ static void handle_incoming_request(struct ast_sip_session *session, pjsip_rx_da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata)
|
static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type)
|
||||||
{
|
{
|
||||||
struct ast_sip_session_supplement *supplement;
|
struct ast_sip_session_supplement *supplement;
|
||||||
struct pjsip_status_line status = rdata->msg_info.msg->line.status;
|
struct pjsip_status_line status = rdata->msg_info.msg->line.status;
|
||||||
|
|
||||||
|
/* Squash all redirect transaction related responses as the supplements have already been invoked */
|
||||||
|
if (type == PJSIP_EVENT_TSX_STATE && PJSIP_IS_STATUS_IN_CLASS(status.code, 300)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ast_debug(3, "Response is %d %.*s\n", status.code, (int) pj_strlen(&status.reason),
|
ast_debug(3, "Response is %d %.*s\n", status.code, (int) pj_strlen(&status.reason),
|
||||||
pj_strbuf(&status.reason));
|
pj_strbuf(&status.reason));
|
||||||
|
|
||||||
@@ -1812,15 +1817,15 @@ static void handle_incoming_response(struct ast_sip_session *session, pjsip_rx_d
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_incoming(struct ast_sip_session *session, pjsip_rx_data *rdata)
|
static int handle_incoming(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_event_id_e type)
|
||||||
{
|
{
|
||||||
ast_debug(3, "Received %s\n", rdata->msg_info.msg->type == PJSIP_REQUEST_MSG ?
|
ast_debug(3, "Received %s\n", rdata->msg_info.msg->type == PJSIP_REQUEST_MSG ?
|
||||||
"request" : "response");
|
"request" : "response");
|
||||||
|
|
||||||
if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {
|
if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {
|
||||||
handle_incoming_request(session, rdata);
|
handle_incoming_request(session, rdata, type);
|
||||||
} else {
|
} else {
|
||||||
handle_incoming_response(session, rdata);
|
handle_incoming_response(session, rdata, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1910,7 +1915,7 @@ static void session_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e)
|
|||||||
handle_outgoing(session, e->body.tx_msg.tdata);
|
handle_outgoing(session, e->body.tx_msg.tdata);
|
||||||
break;
|
break;
|
||||||
case PJSIP_EVENT_RX_MSG:
|
case PJSIP_EVENT_RX_MSG:
|
||||||
handle_incoming(session, e->body.rx_msg.rdata);
|
handle_incoming(session, e->body.rx_msg.rdata, type);
|
||||||
break;
|
break;
|
||||||
case PJSIP_EVENT_TSX_STATE:
|
case PJSIP_EVENT_TSX_STATE:
|
||||||
ast_debug(3, "Source of transaction state change is %s\n", pjsip_event_str(e->body.tsx_state.type));
|
ast_debug(3, "Source of transaction state change is %s\n", pjsip_event_str(e->body.tsx_state.type));
|
||||||
@@ -1920,7 +1925,7 @@ static void session_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e)
|
|||||||
handle_outgoing(session, e->body.tsx_state.src.tdata);
|
handle_outgoing(session, e->body.tsx_state.src.tdata);
|
||||||
break;
|
break;
|
||||||
case PJSIP_EVENT_RX_MSG:
|
case PJSIP_EVENT_RX_MSG:
|
||||||
handle_incoming(session, e->body.tsx_state.src.rdata);
|
handle_incoming(session, e->body.tsx_state.src.rdata, type);
|
||||||
break;
|
break;
|
||||||
case PJSIP_EVENT_TRANSPORT_ERROR:
|
case PJSIP_EVENT_TRANSPORT_ERROR:
|
||||||
case PJSIP_EVENT_TIMER:
|
case PJSIP_EVENT_TIMER:
|
||||||
@@ -2003,7 +2008,7 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (tsx->role == PJSIP_ROLE_UAS && tsx->state == PJSIP_TSX_STATE_TRYING) {
|
if (tsx->role == PJSIP_ROLE_UAS && tsx->state == PJSIP_TSX_STATE_TRYING) {
|
||||||
handle_incoming_request(session, e->body.tsx_state.src.rdata);
|
handle_incoming_request(session, e->body.tsx_state.src.rdata, PJSIP_EVENT_TSX_STATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((cb = ast_sip_mod_data_get(tsx->mod_data, session_module.id,
|
if ((cb = ast_sip_mod_data_get(tsx->mod_data, session_module.id,
|
||||||
@@ -2165,6 +2170,8 @@ static pjsip_redirect_op session_inv_on_redirected(pjsip_inv_session *inv, const
|
|||||||
return PJSIP_REDIRECT_STOP;
|
return PJSIP_REDIRECT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handle_incoming(session, e->body.rx_msg.rdata, PJSIP_EVENT_RX_MSG);
|
||||||
|
|
||||||
uri = pjsip_uri_get_uri(target);
|
uri = pjsip_uri_get_uri(target);
|
||||||
|
|
||||||
if (session->endpoint->redirect_method == AST_SIP_REDIRECT_USER) {
|
if (session->endpoint->redirect_method == AST_SIP_REDIRECT_USER) {
|
||||||
|
Reference in New Issue
Block a user