diff options
author | demon-ru <serov.d.p@gmail.com> | 2015-05-20 08:45:13 +0300 |
---|---|---|
committer | Matt Jordan <mjordan@digium.com> | 2015-05-22 09:57:09 -0500 |
commit | 9e2a582d2d9386c173566aa8b4e948bdba349fc4 (patch) | |
tree | cddaff6d69961088fbd228f72c9fe5e7ff677f8c /res | |
parent | 3e2a994c7186111cc9f679b1259b732843e6d6f9 (diff) |
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
Diffstat (limited to 'res')
-rw-r--r-- | res/res_pjsip_outbound_registration.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index a43fca2ec..7f60acdb3 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -383,22 +383,27 @@ 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; } |