[Asterisk-code-review] res pjsip: Filter out non SIP(S) requests (asterisk[master])

Jenkins2 asteriskteam at digium.com
Fri Sep 15 15:37:04 CDT 2017


Jenkins2 has submitted this change and it was merged. ( https://gerrit.asterisk.org/6504 )

Change subject: res_pjsip:  Filter out non SIP(S) requests
......................................................................

res_pjsip:  Filter out non SIP(S) requests

Incoming requests with non sip(s) URIs in the Request, To, From
or Contact URIs are now rejected with
PJSIP_SC_UNSUPPORTED_URI_SCHEME (416).  This is performed in
pjsip_message_filter (formerly pjsip_message_ip_updater) and is
done at pjproject's "TRANSPORT" layer before a request can even
reach the distributor.

URIs read by res_pjsip_outbound_publish from pjsip.conf are now
also checked for both length and sip(s) scheme.  Those URIs read
by outbound registration and aor were already being checked for
scheme but their error messages needed to be updated to include
scheme failure as well as length failure.

Change-Id: Ibb2f9f1d2dc7549da562af4cbd9156c44ffdd460
---
M configs/samples/pjsip.conf.sample
M res/res_pjsip.c
M res/res_pjsip/include/res_pjsip_private.h
M res/res_pjsip/location.c
R res/res_pjsip/pjsip_message_filter.c
M res/res_pjsip_outbound_publish.c
M res/res_pjsip_outbound_registration.c
7 files changed, 204 insertions(+), 78 deletions(-)

Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  Kevin Harwell: Looks good to me, approved
  Jenkins2: Approved for Submit



diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index 1e1029b..9a2592b 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -1147,7 +1147,7 @@
 
 
 ; MODULE PROVIDING BELOW SECTION(S): res_pjsip_outbound_publish
-;======================OUTBOUND_PUBLISHEN SECTION OPTIONS=====================
+;======================OUTBOUND_PUBLISH SECTION OPTIONS=====================
 ; See https://wiki.asterisk.org/wiki/display/AST/Publishing+Extension+State
 ; for more information.
 ;[outbound-publish]
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index 0ff6ab8..6c1f776 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -4674,7 +4674,7 @@
 	 */
 	if (ast_pjsip_endpoint && serializer_pool[0]) {
 		ast_res_pjsip_cleanup_options_handling();
-		ast_res_pjsip_cleanup_message_ip_updater();
+		ast_res_pjsip_cleanup_message_filter();
 		ast_sip_destroy_distributor();
 		ast_res_pjsip_destroy_configuration();
 		ast_sip_destroy_system();
@@ -4853,7 +4853,7 @@
 
 	ast_res_pjsip_init_options_handling(0);
 
-	if (ast_res_pjsip_init_message_ip_updater()) {
+	if (ast_res_pjsip_init_message_filter()) {
 		ast_log(LOG_ERROR, "Failed to initialize message IP updating. Aborting load\n");
 		goto error;
 	}
diff --git a/res/res_pjsip/include/res_pjsip_private.h b/res/res_pjsip/include/res_pjsip_private.h
index 2969f0e..9fd7aed 100644
--- a/res/res_pjsip/include/res_pjsip_private.h
+++ b/res/res_pjsip/include/res_pjsip_private.h
@@ -212,7 +212,7 @@
  * \retval 0 on success
  * \retval other on failure
  */
-int ast_res_pjsip_init_message_ip_updater(void);
+int ast_res_pjsip_init_message_filter(void);
 
 /*!
  * \internal
@@ -269,7 +269,7 @@
  * \internal
  * \brief Clean up res_pjsip message ip updating handling
  */
-void ast_res_pjsip_cleanup_message_ip_updater(void);
+void ast_res_pjsip_cleanup_message_filter(void);
 
 /*!
  * \internal
diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c
index 2273273..9945c7c 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -613,7 +613,7 @@
 		}
 
 		if (ast_sip_validate_uri_length(contact_uri)) {
-			ast_log(LOG_ERROR, "Contact uri or hostname length exceeds pjproject limit: %s\n", contact_uri);
+			ast_log(LOG_ERROR, "Contact uri or hostname length exceeds pjproject limit or is not a sip(s) uri: %s\n", contact_uri);
 			return -1;
 		}
 
diff --git a/res/res_pjsip/pjsip_message_ip_updater.c b/res/res_pjsip/pjsip_message_filter.c
similarity index 60%
rename from res/res_pjsip/pjsip_message_ip_updater.c
rename to res/res_pjsip/pjsip_message_filter.c
index 099ecaa..63b8bd5 100644
--- a/res/res_pjsip/pjsip_message_ip_updater.c
+++ b/res/res_pjsip/pjsip_message_filter.c
@@ -27,72 +27,72 @@
 
 #define MOD_DATA_RESTRICTIONS "restrictions"
 
-static pj_status_t multihomed_on_tx_message(pjsip_tx_data *tdata);
-static pj_bool_t multihomed_on_rx_message(pjsip_rx_data *rdata);
+static pj_status_t filter_on_tx_message(pjsip_tx_data *tdata);
+static pj_bool_t filter_on_rx_message(pjsip_rx_data *rdata);
 
 /*! \brief Outgoing message modification restrictions */
-struct multihomed_message_restrictions {
+struct filter_message_restrictions {
 	/*! \brief Disallow modification of the From domain */
 	unsigned int disallow_from_domain_modification;
 };
 
-static pjsip_module multihomed_module = {
-	.name = { "Multihomed Routing", 18 },
+static pjsip_module filter_module = {
+	.name = { "Message Filtering", 17 },
 	.id = -1,
-	.priority = PJSIP_MOD_PRIORITY_TSX_LAYER - 1,
-	.on_tx_request = multihomed_on_tx_message,
-	.on_tx_response = multihomed_on_tx_message,
-	.on_rx_request = multihomed_on_rx_message,
+	.priority = PJSIP_MOD_PRIORITY_TRANSPORT_LAYER,
+	.on_tx_request = filter_on_tx_message,
+	.on_tx_response = filter_on_tx_message,
+	.on_rx_request = filter_on_rx_message,
 };
 
 /*! \brief Helper function to get (or allocate if not already present) restrictions on a message */
-static struct multihomed_message_restrictions *multihomed_get_restrictions(pjsip_tx_data *tdata)
+static struct filter_message_restrictions *get_restrictions(pjsip_tx_data *tdata)
 {
-	struct multihomed_message_restrictions *restrictions;
+	struct filter_message_restrictions *restrictions;
 
-	restrictions = ast_sip_mod_data_get(tdata->mod_data, multihomed_module.id, MOD_DATA_RESTRICTIONS);
+	restrictions = ast_sip_mod_data_get(tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS);
 	if (restrictions) {
 		return restrictions;
 	}
 
-	restrictions = PJ_POOL_ALLOC_T(tdata->pool, struct multihomed_message_restrictions);
-	ast_sip_mod_data_set(tdata->pool, tdata->mod_data, multihomed_module.id, MOD_DATA_RESTRICTIONS, restrictions);
+	restrictions = PJ_POOL_ALLOC_T(tdata->pool, struct filter_message_restrictions);
+	ast_sip_mod_data_set(tdata->pool, tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS, restrictions);
 
 	return restrictions;
 }
 
 /*! \brief Callback invoked on non-session outgoing messages */
-static void multihomed_outgoing_message(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata)
+static void filter_outgoing_message(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata)
 {
-	struct multihomed_message_restrictions *restrictions = multihomed_get_restrictions(tdata);
+	struct filter_message_restrictions *restrictions = get_restrictions(tdata);
 
 	restrictions->disallow_from_domain_modification = !ast_strlen_zero(endpoint->fromdomain);
 }
 
 /*! \brief PJSIP Supplement for tagging messages with restrictions */
-static struct ast_sip_supplement multihomed_supplement = {
+static struct ast_sip_supplement filter_supplement = {
 	.priority = AST_SIP_SUPPLEMENT_PRIORITY_FIRST,
-	.outgoing_request = multihomed_outgoing_message,
-	.outgoing_response = multihomed_outgoing_message,
+	.outgoing_request = filter_outgoing_message,
+	.outgoing_response = filter_outgoing_message,
 };
 
 /*! \brief Callback invoked on session outgoing messages */
-static void multihomed_session_outgoing_message(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
+static void filter_session_outgoing_message(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
 {
-	struct multihomed_message_restrictions *restrictions = multihomed_get_restrictions(tdata);
+	struct filter_message_restrictions *restrictions = get_restrictions(tdata);
 
 	restrictions->disallow_from_domain_modification = !ast_strlen_zero(session->endpoint->fromdomain);
 }
 
 /*! \brief PJSIP Session Supplement for tagging messages with restrictions */
-static struct ast_sip_session_supplement multihomed_session_supplement = {
+static struct ast_sip_session_supplement filter_session_supplement = {
 	.priority = 1,
-	.outgoing_request = multihomed_session_outgoing_message,
-	.outgoing_response = multihomed_session_outgoing_message,
+	.outgoing_request = filter_session_outgoing_message,
+	.outgoing_response = filter_session_outgoing_message,
 };
 
 /*! \brief Helper function which returns a UDP transport bound to the given address and port */
-static pjsip_transport *multihomed_get_udp_transport(pj_str_t *address, int port)
+static pjsip_transport *get_udp_transport(pj_str_t *address, int port)
 {
 	struct ao2_container *transport_states = ast_sip_get_transport_states();
 	struct ast_sip_transport_state *transport_state;
@@ -121,7 +121,7 @@
 }
 
 /*! \brief Helper function which determines if a transport is bound to any */
-static int multihomed_bound_any(pjsip_transport *transport)
+static int is_bound_any(pjsip_transport *transport)
 {
 	pj_uint32_t loop6[4] = {0, 0, 0, 0};
 
@@ -156,6 +156,19 @@
 #define is_sip_uri(uri) \
 	(PJSIP_URI_SCHEME_IS_SIP(uri) || PJSIP_URI_SCHEME_IS_SIPS(uri))
 
+static void print_sanitize_debug(char *msg, pjsip_uri_context_e context, pjsip_sip_uri *uri)
+{
+#ifdef AST_DEVMODE
+	char hdrbuf[512];
+	int hdrbuf_len;
+
+	hdrbuf_len = pjsip_uri_print(context, uri, hdrbuf, 512);
+	hdrbuf[hdrbuf_len] = '\0';
+	ast_debug(2, "%s: %s\n", msg, hdrbuf);
+#endif
+}
+
+/* If in DEVMODE, prevent inlining to assist in debugging */
 #ifdef AST_DEVMODE
 #define FUNC_ATTRS __attribute__ ((noinline))
 #else
@@ -167,21 +180,12 @@
 	static const pj_str_t x_name = { AST_SIP_X_AST_TXP, AST_SIP_X_AST_TXP_LEN };
 	pjsip_param *x_transport;
 	pjsip_sip_uri *uri;
-	pjsip_fromto_hdr *fromto;
-	pjsip_contact_hdr *contact;
 	pjsip_hdr *hdr;
-#ifdef AST_DEVMODE
-	char hdrbuf[512];
-	int hdrbuf_len;
-#endif
 
 	if (tdata->msg->type == PJSIP_REQUEST_MSG) {
 		if (is_sip_uri(tdata->msg->line.req.uri)) {
 			uri = pjsip_uri_get_uri(tdata->msg->line.req.uri);
-#ifdef AST_DEVMODE
-			hdrbuf_len = pjsip_uri_print(PJSIP_URI_IN_REQ_URI, uri, hdrbuf, 512);
-			ast_debug(2, "Sanitizing Request: %s\n", hdrbuf);
-#endif
+			print_sanitize_debug("Sanitizing Request", PJSIP_URI_IN_REQ_URI, uri);
 			while ((x_transport = pjsip_param_find(&uri->other_param, &x_name))) {
 				pj_list_erase(x_transport);
 			}
@@ -190,27 +194,17 @@
 
 	for (hdr = tdata->msg->hdr.next; hdr != &tdata->msg->hdr; hdr = hdr->next) {
 		if (hdr->type == PJSIP_H_TO || hdr->type == PJSIP_H_FROM) {
-			fromto = (pjsip_fromto_hdr *) hdr;
-			if (is_sip_uri(fromto->uri)) {
-				uri = pjsip_uri_get_uri(fromto->uri);
-#ifdef AST_DEVMODE
-				hdrbuf_len = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, uri, hdrbuf, 512);
-				hdrbuf[hdrbuf_len] = '\0';
-				ast_debug(2, "Sanitizing From/To: %s\n", hdrbuf);
-#endif
+			if (is_sip_uri(((pjsip_fromto_hdr *) hdr)->uri)) {
+				uri = pjsip_uri_get_uri(((pjsip_fromto_hdr *) hdr)->uri);
+				print_sanitize_debug("Sanitizing From/To header", PJSIP_URI_IN_FROMTO_HDR, uri);
 				while ((x_transport = pjsip_param_find(&uri->other_param, &x_name))) {
 					pj_list_erase(x_transport);
 				}
 			}
 		} else if (hdr->type == PJSIP_H_CONTACT) {
-			contact = (pjsip_contact_hdr *) hdr;
-			if (is_sip_uri(contact->uri)) {
-				uri = pjsip_uri_get_uri(contact->uri);
-#ifdef AST_DEVMODE
-				hdrbuf_len = pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, uri, hdrbuf, 512);
-				hdrbuf[hdrbuf_len] = '\0';
-				ast_debug(2, "Sanitizing Contact: %s\n", hdrbuf);
-#endif
+			if (!((pjsip_contact_hdr *) hdr)->star && is_sip_uri(((pjsip_contact_hdr *) hdr)->uri)) {
+				uri = pjsip_uri_get_uri(((pjsip_contact_hdr *) hdr)->uri);
+				print_sanitize_debug("Sanitizing Contact header", PJSIP_URI_IN_CONTACT_HDR, uri);
 				while ((x_transport = pjsip_param_find(&uri->other_param, &x_name))) {
 					pj_list_erase(x_transport);
 				}
@@ -221,9 +215,9 @@
 	pjsip_tx_data_invalidate_msg(tdata);
 }
 
-static pj_status_t multihomed_on_tx_message(pjsip_tx_data *tdata)
+static pj_status_t filter_on_tx_message(pjsip_tx_data *tdata)
 {
-	struct multihomed_message_restrictions *restrictions = ast_sip_mod_data_get(tdata->mod_data, multihomed_module.id, MOD_DATA_RESTRICTIONS);
+	struct filter_message_restrictions *restrictions = ast_sip_mod_data_get(tdata->mod_data, filter_module.id, MOD_DATA_RESTRICTIONS);
 	pjsip_tpmgr_fla2_param prm;
 	pjsip_cseq_hdr *cseq;
 	pjsip_via_hdr *via;
@@ -256,7 +250,7 @@
 			tdata->tp_info.transport->key.type == PJSIP_TRANSPORT_UDP6) {
 			pjsip_transport *transport;
 
-			transport = multihomed_get_udp_transport(&prm.ret_addr, prm.ret_port);
+			transport = get_udp_transport(&prm.ret_addr, prm.ret_port);
 
 			if (transport) {
 				tdata->tp_info.transport = transport;
@@ -264,7 +258,7 @@
 		}
 
 		/* If the chosen transport is not bound to any we can't use the source address as it won't get back to us */
-		if (!multihomed_bound_any(tdata->tp_info.transport)) {
+		if (!is_bound_any(tdata->tp_info.transport)) {
 			pj_strassign(&prm.ret_addr, &tdata->tp_info.transport->local_name.host);
 		}
 	} else {
@@ -345,7 +339,104 @@
 	return PJ_SUCCESS;
 }
 
-static pj_bool_t multihomed_on_rx_message(pjsip_rx_data *rdata)
+enum uri_type {
+	URI_TYPE_REQUEST = -1,
+	URI_TYPE_TO = PJSIP_H_TO,
+	URI_TYPE_FROM = PJSIP_H_FROM,
+	URI_TYPE_CONTACT = PJSIP_H_CONTACT,
+};
+
+static void print_uri_debug(enum uri_type ut, pjsip_rx_data *rdata, pjsip_hdr *hdr)
+{
+#ifdef AST_DEVMODE
+	pjsip_uri *local_uri = NULL;
+	char hdrbuf[512];
+	int hdrbuf_len;
+	char *request_uri;
+	pjsip_uri_context_e context = PJSIP_URI_IN_OTHER;
+	char header_name[32];
+
+	switch (ut) {
+	case(URI_TYPE_REQUEST):
+		context = PJSIP_URI_IN_REQ_URI;
+		strcpy(header_name, "Request"); /* Safe */
+		local_uri = rdata->msg_info.msg->line.req.uri;
+		break;
+	case(PJSIP_H_FROM):
+		strcpy(header_name, "From"); /* Safe */
+		context = PJSIP_URI_IN_FROMTO_HDR;
+		local_uri = pjsip_uri_get_uri(((pjsip_from_hdr *)hdr)->uri);
+		break;
+	case(PJSIP_H_TO):
+		strcpy(header_name, "To"); /* Safe */
+		context = PJSIP_URI_IN_FROMTO_HDR;
+		local_uri = pjsip_uri_get_uri(((pjsip_to_hdr *)hdr)->uri);
+		break;
+	case(PJSIP_H_CONTACT):
+		strcpy(header_name, "Contact"); /* Safe */
+		context = PJSIP_URI_IN_CONTACT_HDR;
+		local_uri = pjsip_uri_get_uri(((pjsip_contact_hdr *)hdr)->uri);
+		break;
+	}
+
+	hdrbuf_len = pjsip_uri_print(PJSIP_URI_IN_REQ_URI, rdata->msg_info.msg->line.req.uri, hdrbuf, 512);
+	hdrbuf[hdrbuf_len] = '\0';
+	request_uri = ast_strdupa(hdrbuf);
+	hdrbuf_len = pjsip_uri_print(context, local_uri, hdrbuf, 512);
+	hdrbuf[hdrbuf_len] = '\0';
+
+	ast_debug(2, "There was a non sip(s) URI scheme in %s URI '%s' for request '%*.*s %s'\n",
+		header_name, hdrbuf,
+		(int)rdata->msg_info.msg->line.req.method.name.slen,
+		(int)rdata->msg_info.msg->line.req.method.name.slen,
+		rdata->msg_info.msg->line.req.method.name.ptr, request_uri);
+#endif
+}
+
+static pj_bool_t on_rx_process_uris(pjsip_rx_data *rdata)
+{
+	pjsip_contact_hdr *contact = NULL;
+
+	if (rdata->msg_info.msg->type != PJSIP_REQUEST_MSG) {
+		return PJ_FALSE;
+	}
+
+	if (!is_sip_uri(rdata->msg_info.msg->line.req.uri)) {
+		print_uri_debug(URI_TYPE_REQUEST, rdata, NULL);
+		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata,
+			PJSIP_SC_UNSUPPORTED_URI_SCHEME, NULL, NULL, NULL);
+		return PJ_TRUE;
+	}
+
+	if (!is_sip_uri(rdata->msg_info.from->uri)) {
+		print_uri_debug(URI_TYPE_FROM, rdata, (pjsip_hdr *)rdata->msg_info.from);
+		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata,
+			PJSIP_SC_UNSUPPORTED_URI_SCHEME, NULL, NULL, NULL);
+		return PJ_TRUE;
+	}
+
+	if (!is_sip_uri(rdata->msg_info.to->uri)) {
+		print_uri_debug(URI_TYPE_TO, rdata, (pjsip_hdr *)rdata->msg_info.to);
+		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata,
+			PJSIP_SC_UNSUPPORTED_URI_SCHEME, NULL, NULL, NULL);
+		return PJ_TRUE;
+	}
+
+	while ((contact =
+		(pjsip_contact_hdr *) pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
+			contact ? contact->next : NULL))) {
+		if (!contact->star && !is_sip_uri(contact->uri)) {
+			print_uri_debug(URI_TYPE_CONTACT, rdata, (pjsip_hdr *)contact);
+			pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata,
+				PJSIP_SC_UNSUPPORTED_URI_SCHEME, NULL, NULL, NULL);
+			return PJ_TRUE;
+		}
+	}
+
+	return PJ_FALSE;
+}
+
+static pj_bool_t on_rx_process_symmetric_transport(pjsip_rx_data *rdata)
 {
 	pjsip_contact_hdr *contact;
 	pjsip_sip_uri *uri;
@@ -388,29 +479,46 @@
 	return PJ_FALSE;
 }
 
-void ast_res_pjsip_cleanup_message_ip_updater(void)
+static pj_bool_t filter_on_rx_message(pjsip_rx_data *rdata)
 {
-	ast_sip_unregister_service(&multihomed_module);
-	ast_sip_unregister_supplement(&multihomed_supplement);
-	ast_sip_session_unregister_supplement(&multihomed_session_supplement);
+	pj_bool_t rc;
+
+	rc = on_rx_process_uris(rdata);
+	if (rc == PJ_TRUE) {
+		return rc;
+	}
+
+	rc = on_rx_process_symmetric_transport(rdata);
+	if (rc == PJ_TRUE) {
+		return rc;
+	}
+
+	return PJ_FALSE;
 }
 
-int ast_res_pjsip_init_message_ip_updater(void)
+void ast_res_pjsip_cleanup_message_filter(void)
 {
-	if (ast_sip_session_register_supplement(&multihomed_session_supplement)) {
-		ast_log(LOG_ERROR, "Could not register multihomed session supplement for outgoing requests\n");
+	ast_sip_unregister_service(&filter_module);
+	ast_sip_unregister_supplement(&filter_supplement);
+	ast_sip_session_unregister_supplement(&filter_session_supplement);
+}
+
+int ast_res_pjsip_init_message_filter(void)
+{
+	if (ast_sip_session_register_supplement(&filter_session_supplement)) {
+		ast_log(LOG_ERROR, "Could not register message filter session supplement for outgoing requests\n");
 		return -1;
 	}
 
-	if (ast_sip_register_supplement(&multihomed_supplement)) {
-		ast_log(LOG_ERROR, "Could not register multihomed supplement for outgoing requests\n");
-		ast_res_pjsip_cleanup_message_ip_updater();
+	if (ast_sip_register_supplement(&filter_supplement)) {
+		ast_log(LOG_ERROR, "Could not register message filter supplement for outgoing requests\n");
+		ast_res_pjsip_cleanup_message_filter();
 		return -1;
 	}
 
-	if (ast_sip_register_service(&multihomed_module)) {
-		ast_log(LOG_ERROR, "Could not register multihomed module for incoming and outgoing requests\n");
-		ast_res_pjsip_cleanup_message_ip_updater();
+	if (ast_sip_register_service(&filter_module)) {
+		ast_log(LOG_ERROR, "Could not register message filter module for incoming and outgoing requests\n");
+		ast_res_pjsip_cleanup_message_filter();
 		return -1;
 	}
 
diff --git a/res/res_pjsip_outbound_publish.c b/res/res_pjsip_outbound_publish.c
index c413cb0..18525bf 100644
--- a/res/res_pjsip_outbound_publish.c
+++ b/res/res_pjsip_outbound_publish.c
@@ -34,6 +34,7 @@
 #include "asterisk/taskprocessor.h"
 #include "asterisk/threadpool.h"
 #include "asterisk/datastore.h"
+#include "res_pjsip/include/res_pjsip_private.h"
 
 /*** DOCUMENTATION
 	<configInfo name="res_pjsip_outbound_publish" language="en_US">
@@ -1459,10 +1460,27 @@
 		ast_log(LOG_ERROR, "No server URI specified on outbound publish '%s'\n",
 			ast_sorcery_object_get_id(publish));
 		return -1;
+	} else if (ast_sip_validate_uri_length(publish->server_uri)) {
+		ast_log(LOG_ERROR, "Server URI or hostname length exceeds pjproject limit or is not a sip(s) uri: '%s' on outbound publish '%s'\n",
+			publish->server_uri,
+			ast_sorcery_object_get_id(publish));
+		return -1;
 	} else if (ast_strlen_zero(publish->event)) {
 		ast_log(LOG_ERROR, "No event type specified for outbound publish '%s'\n",
 			ast_sorcery_object_get_id(publish));
 		return -1;
+	} else if (!ast_strlen_zero(publish->from_uri)
+		&& ast_sip_validate_uri_length(publish->from_uri)) {
+		ast_log(LOG_ERROR, "From URI or hostname length exceeds pjproject limit or is not a sip(s) uri: '%s' on outbound publish '%s'\n",
+			publish->from_uri,
+			ast_sorcery_object_get_id(publish));
+		return -1;
+	} else if (!ast_strlen_zero(publish->to_uri)
+		&& ast_sip_validate_uri_length(publish->to_uri)) {
+		ast_log(LOG_ERROR, "To URI or hostname length exceeds pjproject limit or is not a sip(s) uri: '%s' on outbound publish '%s'\n",
+			publish->to_uri,
+			ast_sorcery_object_get_id(publish));
+		return -1;
 	}
 	return 0;
 }
diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c
index bbb286a..4697e5c 100644
--- a/res/res_pjsip_outbound_registration.c
+++ b/res/res_pjsip_outbound_registration.c
@@ -1428,7 +1428,7 @@
 			ast_sorcery_object_get_id(applied));
 		return -1;
 	} else if (ast_sip_validate_uri_length(applied->server_uri)) {
-			ast_log(LOG_ERROR, "Server URI or hostname length exceeds pjpropject limit '%s'\n",
+			ast_log(LOG_ERROR, "Server URI or hostname length exceeds pjproject limit or is not a sip(s) uri: '%s'\n",
 				ast_sorcery_object_get_id(applied));
 			return -1;
 	} else if (ast_strlen_zero(applied->client_uri)) {
@@ -1436,7 +1436,7 @@
 			ast_sorcery_object_get_id(applied));
 		return -1;
 	} else if (ast_sip_validate_uri_length(applied->client_uri)) {
-			ast_log(LOG_ERROR, "Client URI or hostname length exceeds pjpropject limit '%s'\n",
+			ast_log(LOG_ERROR, "Client URI or hostname length exceeds pjproject limit or is not a sip(s) uri: '%s'\n",
 				ast_sorcery_object_get_id(applied));
 			return -1;
 	} else if (applied->line && ast_strlen_zero(applied->endpoint)) {

-- 
To view, visit https://gerrit.asterisk.org/6504
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ibb2f9f1d2dc7549da562af4cbd9156c44ffdd460
Gerrit-Change-Number: 6504
Gerrit-PatchSet: 1
Gerrit-Owner: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Jenkins2
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Kevin Harwell <kharwell at digium.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20170915/95f38119/attachment-0001.html>


More information about the asterisk-code-review mailing list