]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Strip spaces from items parsed from comma-separated lists 59/2359/4
authorGeorge Joseph <george.joseph@fairview5.com>
Sun, 6 Mar 2016 20:38:41 +0000 (13:38 -0700)
committerGeorge Joseph <george.joseph@fairview5.com>
Mon, 7 Mar 2016 19:16:41 +0000 (13:16 -0600)
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

12 files changed:
channels/pjsip/dialplan_functions.c
include/asterisk/strings.h
res/res_pjsip/config_transport.c
res/res_pjsip/location.c
res/res_pjsip/pjsip_configuration.c
res/res_pjsip/pjsip_options.c
res/res_pjsip_endpoint_identifier_ip.c
res/res_pjsip_mwi.c
res/res_pjsip_notify.c
res/res_pjsip_path.c
res/res_pjsip_pubsub.c
res/res_pjsip_registrar.c

index b86cfad5368981c6a9c098261e65943aa99cf357..1c0899732218433adb3ca663fd16a57af34e65a9 100644 (file)
@@ -819,7 +819,7 @@ int pjsip_acf_dial_contacts_read(struct ast_channel *chan, const char *cmd, char
                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;
index af5ae6c55655900885066f47983c2e169ee720cb..3701b5305939364826acde1b58cc0ae9760c90a6 100644 (file)
@@ -145,8 +145,12 @@ static int force_inline attribute_pure ast_ends_with(const char *str, const char
 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 @@ char *ast_trim_blanks(char *str),
 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;
 }
 )
index 61a979c88579a967b3cbe2681944358655097938..db579bf2f628f7701db0349be65eda893af77597 100644 (file)
@@ -985,8 +985,7 @@ static int transport_tls_cipher_handler(const struct aco_option *opt, struct ast
        }
 
        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;
                }
index c070e7dbcebd041e798ad9c7b36129a12aadbac7..4008abad1f990a2642764ed1f27025c1802e0d7f 100644 (file)
@@ -205,7 +205,7 @@ void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, s
        *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,12 +377,16 @@ static int permanent_uri_handler(const struct aco_option *opt, struct ast_variab
        }
 
        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,
                                AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, permanent_uri_sort_fn, NULL);
@@ -442,7 +446,7 @@ int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg)
        }
 
        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 @@ int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg)
                        return -1;
                }
        }
-       ast_free(copy);
        return 0;
 }
 
index 2a81cfded276e511219ae716ef34acb7479c5e90..371e4318ba88c97c76ecc07ed224d81c53d2a163 100644 (file)
@@ -410,7 +410,7 @@ int ast_sip_auth_vector_init(struct ast_sip_auth_vector *auths, const char *valu
                return -1;
        }
 
-       while ((val = strsep(&auth_names, ","))) {
+       while ((val = ast_strip(strsep(&auth_names, ",")))) {
                if (ast_strlen_zero(val)) {
                        continue;
                }
@@ -477,7 +477,11 @@ static int ident_handler(const struct aco_option *opt, struct ast_variable *var,
        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 {
index 73f12a00c585e0d9c900f375ac9d53213846a6de..aed9620303be7dfed3decd94d3e7e38a50550cd0 100644 (file)
@@ -270,7 +270,7 @@ static int on_endpoint(void *obj, void *arg, int flags)
        }
 
        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 @@ static int cli_qualify_contacts(void *data)
        }
 
        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 @@ static int ami_sip_qualify(struct mansession *s, const struct message *m)
        }
 
        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 @@ static int qualify_and_schedule_all_cb(void *obj, void *arg, int flags)
        }
 
        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;
 
index f73bdae7e434389bf5839f5f3d63a50cfd3fbcd7..016e0b4ad0882b19810fc8c0bfca74d0f7140e47 100644 (file)
@@ -164,11 +164,15 @@ static int ip_identify_match_handler(const struct aco_option *opt, struct ast_va
                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);
 
index e1eea6f2ae82cf323329b1ddb27fc61bb7f9e564..c9d1b743e5db7ef990e1e9832434dc9a00e98c40 100644 (file)
@@ -432,7 +432,7 @@ static void send_unsolicited_mwi_notify(struct mwi_subscription *sub,
        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 @@ static int mwi_validate_for_aor(void *obj, void *arg, int flags)
        }
 
        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,9 +626,13 @@ static int mwi_on_aor(void *obj, void *arg, int flags)
        }
 
        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) {
                        continue;
@@ -890,7 +898,7 @@ static int create_mwi_subscriptions_for_endpoint(void *obj, void *arg, int flags
 
        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 @@ static int create_mwi_subscriptions_for_endpoint(void *obj, void *arg, int flags
        }
 
        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);
index 6d524152c4ff3fb502a29391c5ef42202d6a538b..8de88c7e89992a4ca25af5167afd19fdff6530a8 100644 (file)
@@ -615,7 +615,7 @@ static int notify_endpoint(void *obj)
 
        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);
index 03cbe50768ee62906b9c8705c53392cbf3b7d700..2dde7323e61e56780518a9a332385c9300d7976b 100644 (file)
@@ -53,9 +53,13 @@ static struct ast_sip_aor *find_aor(struct ast_sip_endpoint *endpoint, pjsip_uri
        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;
                }
index 0da43190cc1a1b3b4acf44cf5f68f922592712c0..57ca95d8c64ecc657c6b3f8cfbb610acf58c9b58 100644 (file)
@@ -3654,7 +3654,11 @@ static int list_item_handler(const struct aco_option *opt,
        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;
index accb1613771c2dd09c10c9e3098178647d3c4c17..46d24324a365ddbbf0a4e9fc87a58ae0c5cb893c 100644 (file)
@@ -651,9 +651,13 @@ static pj_bool_t registrar_on_rx_request(struct pjsip_rx_data *rdata)
        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;
                }