<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/6609">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pjsip_message_filter: Fix regression causing bad contact address<br><br>The "res_pjsip: Filter out non SIP(S) requests" commit moved the<br>filtering of messages to pjproject's PJSIP_MOD_PRIORITY_TRANSPORT_LAYER<br>in order to filter out incoming bad uri schemes as early as possible.<br>Since the change affected outgoing messages as well and the TRANSPORT<br>layer is the last to be run on outgoing messages, we were overwriting<br>the setting of external_signaling_address (which is set earlier by<br>res_pjsip_nat) with an internal address.<br><br>* pjsip_message_filter now registers itself as a pjproject module<br>twice. Once in the TSX layer for the outgoing messages (as it was<br>originally), then a second time in the TRANSPORT layer for the<br>incoming messages to catch the invalid uri schemes.<br><br>ASTERISK-27295<br>Reported by: Sean Bright<br><br>The change thoughThis affected both incoming and outgoing messages<br><br>Change-Id: I2c90190c43370f8a9d1c4693a19fd65840689c8c<br>---<br>M res/res_pjsip/pjsip_message_filter.c<br>1 file changed, 23 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/09/6609/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/res/res_pjsip/pjsip_message_filter.c b/res/res_pjsip/pjsip_message_filter.c<br>index 63b8bd5..d2f9b95 100644<br>--- a/res/res_pjsip/pjsip_message_filter.c<br>+++ b/res/res_pjsip/pjsip_message_filter.c<br>@@ -36,13 +36,19 @@<br> unsigned int disallow_from_domain_modification;<br> };<br> <br>-static pjsip_module filter_module = {<br>- .name = { "Message Filtering", 17 },<br>+static pjsip_module filter_module_transport = {<br>+ .name = { "Message Filtering Transport", 27 },<br> .id = -1,<br> .priority = PJSIP_MOD_PRIORITY_TRANSPORT_LAYER,<br>+ .on_rx_request = filter_on_rx_message,<br>+};<br>+<br>+static pjsip_module filter_module_tsx = {<br>+ .name = { "Message Filtering TSX", 21 },<br>+ .id = -1,<br>+ .priority = PJSIP_MOD_PRIORITY_TSX_LAYER - 1,<br> .on_tx_request = filter_on_tx_message,<br> .on_tx_response = filter_on_tx_message,<br>- .on_rx_request = filter_on_rx_message,<br> };<br> <br> /*! \brief Helper function to get (or allocate if not already present) restrictions on a message */<br>@@ -50,13 +56,13 @@<br> {<br> struct filter_message_restrictions *restrictions;<br> <br>- restrictions = ast_sip_mod_data_get(tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS);<br>+ restrictions = ast_sip_mod_data_get(tdata->mod_data, filter_module_tsx.id, MOD_DATA_RESTRICTIONS);<br> if (restrictions) {<br> return restrictions;<br> }<br> <br> restrictions = PJ_POOL_ALLOC_T(tdata->pool, struct filter_message_restrictions);<br>- ast_sip_mod_data_set(tdata->pool, tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS, restrictions);<br>+ ast_sip_mod_data_set(tdata->pool, tdata->mod_data, filter_module_tsx.id, MOD_DATA_RESTRICTIONS, restrictions);<br> <br> return restrictions;<br> }<br>@@ -217,7 +223,8 @@<br> <br> static pj_status_t filter_on_tx_message(pjsip_tx_data *tdata)<br> {<br>- struct filter_message_restrictions *restrictions = ast_sip_mod_data_get(tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS);<br>+ struct filter_message_restrictions *restrictions =<br>+ ast_sip_mod_data_get(tdata->mod_data, filter_module_transport.id, MOD_DATA_RESTRICTIONS);<br> pjsip_tpmgr_fla2_param prm;<br> pjsip_cseq_hdr *cseq;<br> pjsip_via_hdr *via;<br>@@ -277,7 +284,7 @@<br> /* prm.ret_addr is allocated from the tdata pool OR the transport so it is perfectly fine to just do an assignment like this */<br> pj_strassign(&uri->host, &prm.ret_addr);<br> uri->port = prm.ret_port;<br>- ast_debug(4, "Re-wrote Contact URI host/port to %.*s:%d\n",<br>+ ast_debug(5, "Re-wrote Contact URI host/port to %.*s:%d (this may be re-written again later)\n",<br> (int)pj_strlen(&uri->host), pj_strbuf(&uri->host), uri->port);<br> <br> if (tdata->tp_info.transport->key.type == PJSIP_TRANSPORT_UDP ||<br>@@ -498,7 +505,8 @@<br> <br> void ast_res_pjsip_cleanup_message_filter(void)<br> {<br>- ast_sip_unregister_service(&filter_module);<br>+ ast_sip_unregister_service(&filter_module_tsx);<br>+ ast_sip_unregister_service(&filter_module_transport);<br> ast_sip_unregister_supplement(&filter_supplement);<br> ast_sip_session_unregister_supplement(&filter_session_supplement);<br> }<br>@@ -516,7 +524,13 @@<br> return -1;<br> }<br> <br>- if (ast_sip_register_service(&filter_module)) {<br>+ if (ast_sip_register_service(&filter_module_transport)) {<br>+ ast_log(LOG_ERROR, "Could not register message filter module for incoming and outgoing requests\n");<br>+ ast_res_pjsip_cleanup_message_filter();<br>+ return -1;<br>+ }<br>+<br>+ if (ast_sip_register_service(&filter_module_tsx)) {<br> ast_log(LOG_ERROR, "Could not register message filter module for incoming and outgoing requests\n");<br> ast_res_pjsip_cleanup_message_filter();<br> return -1;<br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/6609">change 6609</a>. To unsubscribe, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/6609"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 15 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2c90190c43370f8a9d1c4693a19fd65840689c8c </div>
<div style="display:none"> Gerrit-Change-Number: 6609 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>