From 42476e66333a9b9841b56b2207760a70b1b835d1 Mon Sep 17 00:00:00 2001 From: demon-ru Date: Wed, 20 May 2015 08:45:13 +0300 Subject: res_pjsip_outbound_registration: Check request URI for line. When an inbound call is received the To header is checked for the "line" option. Some remote servers will place this in the request URI instead. This adds an additional check for the option in the request URI. ASTERISK-25072 #close Reported by: Dmitriy Serov Change-Id: Id4e44debbb80baad623b914a88574371575353c8 --- res/res_pjsip_outbound_registration.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'res') diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index 6af8b8679..c910c9431 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -383,24 +383,29 @@ static int line_identify_relationship(void *obj, void *arg, int flags) return !pj_strcmp2(&line->value, state->client_state->line) ? CMP_MATCH | CMP_STOP : 0; } +static struct pjsip_param *get_uri_option_line(const void *uri) +{ + pjsip_sip_uri *pjuri; + static const pj_str_t LINE_STR = { "line", 4 }; + + if (!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri)) { + return NULL; + } + pjuri = pjsip_uri_get_uri(uri); + return pjsip_param_find(&pjuri->other_param, &LINE_STR); +} + /*! \brief Endpoint identifier which uses the 'line' parameter to establish a relationship to an outgoing registration */ static struct ast_sip_endpoint *line_identify(pjsip_rx_data *rdata) { - pjsip_sip_uri *uri; - static const pj_str_t LINE_STR = { "line", 4 }; pjsip_param *line; RAII_VAR(struct ao2_container *, states, NULL, ao2_cleanup); RAII_VAR(struct sip_outbound_registration_state *, state, NULL, ao2_cleanup); - if (!PJSIP_URI_SCHEME_IS_SIP(rdata->msg_info.to->uri) && !PJSIP_URI_SCHEME_IS_SIPS(rdata->msg_info.to->uri)) { - return NULL; - } - uri = pjsip_uri_get_uri(rdata->msg_info.to->uri); - - line = pjsip_param_find(&uri->other_param, &LINE_STR); - if (!line) { + if (!(line = get_uri_option_line(rdata->msg_info.to->uri)) + && !(line = get_uri_option_line(rdata->msg_info.msg->line.req.uri))) { return NULL; - } + } states = ao2_global_obj_ref(current_states); if (!states) { -- cgit v1.2.3