[Asterisk-code-review] res pjsip: Strip spaces from items parsed from comma-separa... (asterisk[master])

Anonymous Coward asteriskteam at digium.com
Tue Mar 8 12:27:16 CST 2016


Anonymous Coward #1000019 has submitted this change and it was merged.

Change subject: res_pjsip:  Strip spaces from items parsed from comma-separated lists
......................................................................


res_pjsip:  Strip spaces from items parsed from comma-separated lists

Configurations like "aors = a, b, c" were either ignoring everything after "a"
or trying to look up " b".  Same for mailboxes,  ciphers, contacts and a few
others.

To fix, all the strsep(&copy, ",") calls have been wrapped in ast_strip.  To
facilitate this, ast_strip, ast_skip_blanks and ast_skip_nonblanks were
updated to handle null pointers.

In some cases, an ast_strlen_zero() test was added to skip consecutive commas.

There was also an attempt to ast_free an ast_strdupa'd string in
ast_sip_for_each_aor which was causing a SEGV.  I removed it.

Although this issue was reported for realtime, the issue was in the res_pjsip
modules so all config mechanisms were affected.

ASTERISK-25829 #close
Reported-by: Mateusz Kowalski

Change-Id: I0b22a2cf22a7c1c50d4ecacbfa540155bec0e7a2
---
M channels/pjsip/dialplan_functions.c
M include/asterisk/strings.h
M res/res_pjsip/config_transport.c
M res/res_pjsip/location.c
M res/res_pjsip/pjsip_configuration.c
M res/res_pjsip/pjsip_options.c
M res/res_pjsip_endpoint_identifier_ip.c
M res/res_pjsip_mwi.c
M res/res_pjsip_notify.c
M res/res_pjsip_path.c
M res/res_pjsip_pubsub.c
M res/res_pjsip_registrar.c
12 files changed, 71 insertions(+), 29 deletions(-)

Approvals:
  Richard Mudgett: Looks good to me, but someone else must approve
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, approved



diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c
index b86cfad..1c08997 100644
--- a/channels/pjsip/dialplan_functions.c
+++ b/channels/pjsip/dialplan_functions.c
@@ -819,7 +819,7 @@
 		return -1;
 	}
 
-	while ((aor_name = strsep(&rest, ","))) {
+	while ((aor_name = ast_strip(strsep(&rest, ",")))) {
 		RAII_VAR(struct ast_sip_aor *, aor, ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
 		RAII_VAR(struct ao2_container *, contacts, NULL, ao2_cleanup);
 		struct ao2_iterator it_contacts;
diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h
index af5ae6c..3701b53 100644
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -145,8 +145,12 @@
 AST_INLINE_API(
 char * attribute_pure ast_skip_blanks(const char *str),
 {
-	while (*str && ((unsigned char) *str) < 33)
-		str++;
+	if (str) {
+		while (*str && ((unsigned char) *str) < 33) {
+			str++;
+		}
+	}
+
 	return (char *) str;
 }
 )
@@ -184,8 +188,12 @@
 AST_INLINE_API(
 char * attribute_pure ast_skip_nonblanks(const char *str),
 {
-	while (*str && ((unsigned char) *str) > 32)
-		str++;
+	if (str) {
+		while (*str && ((unsigned char) *str) > 32) {
+			str++;
+		}
+	}
+
 	return (char *) str;
 }
 )
diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c
index 61a979c..db579bf 100644
--- a/res/res_pjsip/config_transport.c
+++ b/res/res_pjsip/config_transport.c
@@ -985,8 +985,7 @@
 	}
 
 	parse = ast_strdupa(S_OR(var->value, ""));
-	while ((name = strsep(&parse, ","))) {
-		name = ast_strip(name);
+	while ((name = ast_strip(strsep(&parse, ",")))) {
 		if (ast_strlen_zero(name)) {
 			continue;
 		}
diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c
index c070e7d..4008aba 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -205,7 +205,7 @@
 	*aor = NULL;
 	*contact = NULL;
 
-	while ((aor_name = strsep(&rest, ","))) {
+	while ((aor_name = ast_strip(strsep(&rest, ",")))) {
 		*aor = ast_sip_location_retrieve_aor(aor_name);
 
 		if (!(*aor)) {
@@ -377,11 +377,15 @@
 	}
 
 	contacts = ast_strdupa(var->value);
-	while ((contact_uri = strsep(&contacts, ","))) {
+	while ((contact_uri = ast_strip(strsep(&contacts, ",")))) {
 		struct ast_sip_contact *contact;
 		struct ast_sip_contact_status *status;
 		char hash[33];
 		char contact_id[strlen(aor_id) + sizeof(hash) + 2];
+
+		if (ast_strlen_zero(contact_uri)) {
+			continue;
+		}
 
 		if (!aor->permanent_contacts) {
 			aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
@@ -442,7 +446,7 @@
 	}
 
 	copy = ast_strdupa(aors);
-	while ((name = strsep(&copy, ","))) {
+	while ((name = ast_strip(strsep(&copy, ",")))) {
 		RAII_VAR(struct ast_sip_aor *, aor,
 			 ast_sip_location_retrieve_aor(name), ao2_cleanup);
 
@@ -454,7 +458,6 @@
 			return -1;
 		}
 	}
-	ast_free(copy);
 	return 0;
 }
 
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 2a81cfd..371e431 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -410,7 +410,7 @@
 		return -1;
 	}
 
-	while ((val = strsep(&auth_names, ","))) {
+	while ((val = ast_strip(strsep(&auth_names, ",")))) {
 		if (ast_strlen_zero(val)) {
 			continue;
 		}
@@ -477,7 +477,11 @@
 	char *idents = ast_strdupa(var->value);
 	char *val;
 
-	while ((val = strsep(&idents, ","))) {
+	while ((val = ast_strip(strsep(&idents, ",")))) {
+		if (ast_strlen_zero(val)) {
+			continue;
+		}
+
 		if (!strcasecmp(val, "username")) {
 			endpoint->ident_method |= AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
 		} else {
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index 73f12a0..aed9620 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -270,7 +270,7 @@
 	}
 
 	aors = ast_strdupa(endpoint->aors);
-	while ((aor_name = strsep(&aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&aors, ",")))) {
 		struct ast_sip_aor *aor;
 		struct ao2_container *contacts;
 
@@ -795,7 +795,7 @@
 	}
 
 	aors = ast_strdupa(endpoint->aors);
-	while ((aor_name = strsep(&aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&aors, ",")))) {
 		struct ast_sip_aor *aor;
 		struct ao2_container *contacts;
 
@@ -899,7 +899,7 @@
 	}
 
 	aors = ast_strdupa(endpoint->aors);
-	while ((aor_name = strsep(&aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&aors, ",")))) {
 		struct ast_sip_aor *aor;
 		struct ao2_container *contacts;
 
@@ -1087,7 +1087,7 @@
 	}
 
 	aors = ast_strdupa(endpoint->aors);
-	while ((aor_name = strsep(&aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&aors, ",")))) {
 		struct ast_sip_aor *aor;
 		struct ao2_container *contacts;
 
diff --git a/res/res_pjsip_endpoint_identifier_ip.c b/res/res_pjsip_endpoint_identifier_ip.c
index f73bdae..016e0b4 100644
--- a/res/res_pjsip_endpoint_identifier_ip.c
+++ b/res/res_pjsip_endpoint_identifier_ip.c
@@ -164,11 +164,15 @@
 		return 0;
 	}
 
-	while ((current_string = strsep(&input_string, ","))) {
+	while ((current_string = ast_strip(strsep(&input_string, ",")))) {
 		struct ast_sockaddr *addrs;
 		int num_addrs = 0, error = 0, i;
 		char *mask = strrchr(current_string, '/');
 
+		if (ast_strlen_zero(current_string)) {
+			continue;
+		}
+
 		if (mask) {
 			identify->matches = ast_append_ha("d", current_string, identify->matches, &error);
 
diff --git a/res/res_pjsip_mwi.c b/res/res_pjsip_mwi.c
index e1eea6f..c9d1b74 100644
--- a/res/res_pjsip_mwi.c
+++ b/res/res_pjsip_mwi.c
@@ -432,7 +432,7 @@
 	ast_debug(5, "Sending unsolicited MWI NOTIFY to endpoint %s, new messages: %d, old messages: %d\n",
 			sub->id, counter->new_msgs, counter->old_msgs);
 
-	while ((aor_name = strsep(&endpoint_aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&endpoint_aors, ",")))) {
 		RAII_VAR(struct ast_sip_aor *, aor, ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
 		RAII_VAR(struct ao2_container *, contacts, NULL, ao2_cleanup);
 		struct unsolicited_mwi_data mwi_data = {
@@ -598,7 +598,11 @@
 	}
 
 	mailboxes = ast_strdupa(aor->mailboxes);
-	while ((mailbox = strsep(&mailboxes, ","))) {
+	while ((mailbox = ast_strip(strsep(&mailboxes, ",")))) {
+		if (ast_strlen_zero(mailbox)) {
+			continue;
+		}
+
 		if (endpoint_receives_unsolicited_mwi_for_mailbox(endpoint, mailbox)) {
 			ast_debug(1, "Endpoint '%s' already configured for unsolicited MWI for mailbox '%s'. "
 					"Denying MWI subscription to %s\n", ast_sorcery_object_get_id(endpoint), mailbox,
@@ -622,8 +626,12 @@
 	}
 
 	mailboxes = ast_strdupa(aor->mailboxes);
-	while ((mailbox = strsep(&mailboxes, ","))) {
+	while ((mailbox = ast_strip(strsep(&mailboxes, ",")))) {
 		struct mwi_stasis_subscription *mwi_stasis_sub;
+
+		if (ast_strlen_zero(mailbox)) {
+			continue;
+		}
 
 		mwi_stasis_sub = mwi_stasis_subscription_alloc(mailbox, sub);
 		if (!mwi_stasis_sub) {
@@ -890,7 +898,7 @@
 
 	endpoint_aors = ast_strdupa(endpoint->aors);
 
-	while ((aor_name = strsep(&endpoint_aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&endpoint_aors, ",")))) {
 		RAII_VAR(struct ast_sip_aor *, aor, ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
 
 		if (!aor) {
@@ -921,11 +929,15 @@
 	}
 
 	mailboxes = ast_strdupa(endpoint->subscription.mwi.mailboxes);
-	while ((mailbox = strsep(&mailboxes, ","))) {
-		struct mwi_subscription *sub = aggregate_sub ?:
-			mwi_subscription_alloc(endpoint, 0, NULL);
+	while ((mailbox = ast_strip(strsep(&mailboxes, ",")))) {
+		struct mwi_subscription *sub;
 		struct mwi_stasis_subscription *mwi_stasis_sub;
 
+		if (ast_strlen_zero(mailbox)) {
+			continue;
+		}
+
+		sub = aggregate_sub ?: mwi_subscription_alloc(endpoint, 0, NULL);
 		mwi_stasis_sub = mwi_stasis_subscription_alloc(mailbox, sub);
 		if (mwi_stasis_sub) {
 			ao2_link(sub->stasis_subs, mwi_stasis_sub);
diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c
index 6d52415..8de88c7 100644
--- a/res/res_pjsip_notify.c
+++ b/res/res_pjsip_notify.c
@@ -615,7 +615,7 @@
 
 	aors = ast_strdupa(data->endpoint->aors);
 
-	while ((aor_name = strsep(&aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&aors, ",")))) {
 		RAII_VAR(struct ast_sip_aor *, aor,
 			 ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
 		RAII_VAR(struct ao2_container *, contacts, NULL, ao2_cleanup);
diff --git a/res/res_pjsip_path.c b/res/res_pjsip_path.c
index 03cbe50..2dde732 100644
--- a/res/res_pjsip_path.c
+++ b/res/res_pjsip_path.c
@@ -53,9 +53,13 @@
 	configured_aors = ast_strdupa(endpoint->aors);
 
 	/* Iterate the configured AORs to see if the user or the user+domain match */
-	while ((aor_name = strsep(&configured_aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
 		struct ast_sip_domain_alias *alias = NULL;
 
+		if (ast_strlen_zero(aor_name)) {
+			continue;
+		}
+
 		if (!pj_strcmp2(&sip_uri->user, aor_name)) {
 			break;
 		}
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c
index 0da4319..57ca95d 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -3654,7 +3654,11 @@
 	char *items = ast_strdupa(var->value);
 	char *item;
 
-	while ((item = strsep(&items, ","))) {
+	while ((item = ast_strip(strsep(&items, ",")))) {
+		if (ast_strlen_zero(item)) {
+			continue;
+		}
+
 		if (item_in_vector(list, item)) {
 			ast_log(LOG_WARNING, "Ignoring duplicated list item '%s'\n", item);
 			continue;
diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c
index accb161..46d2432 100644
--- a/res/res_pjsip_registrar.c
+++ b/res/res_pjsip_registrar.c
@@ -651,9 +651,13 @@
 	configured_aors = ast_strdupa(endpoint->aors);
 
 	/* Iterate the configured AORs to see if the user or the user+domain match */
-	while ((aor_name = strsep(&configured_aors, ","))) {
+	while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
 		struct ast_sip_domain_alias *alias = NULL;
 
+		if (ast_strlen_zero(aor_name)) {
+			continue;
+		}
+
 		if (!pj_strcmp2(&uri->user, aor_name)) {
 			break;
 		}

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I0b22a2cf22a7c1c50d4ecacbfa540155bec0e7a2
Gerrit-PatchSet: 4
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: George Joseph <george.joseph at fairview5.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>



More information about the asterisk-code-review mailing list