]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_registrar.c: Reduce stack usage in find_aor_name(). 07/3807/1
authorRichard Mudgett <rmudgett@digium.com>
Tue, 30 Aug 2016 21:40:59 +0000 (16:40 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Fri, 2 Sep 2016 18:23:20 +0000 (13:23 -0500)
Change-Id: I8aebad1fdcf303bd115b59a4b57fbbd5b2267f09

res/res_pjsip_registrar.c

index 53209575fab44bc409309e9d562233fd458b2baf..1e0f5ab72d8e5b95831eb76c2a63bee097f212e7 100644 (file)
@@ -563,6 +563,7 @@ static int match_aor(const char *aor_name, const char *id)
 static char *find_aor_name(const char *username, const char *domain, const char *aors)
 {
        char *configured_aors;
+       char *aors_buf;
        char *aor_name;
        char *id_domain;
        struct ast_sip_domain_alias *alias;
@@ -570,8 +571,10 @@ static char *find_aor_name(const char *username, const char *domain, const char
        id_domain = ast_alloca(strlen(username) + strlen(domain) + 2);
        sprintf(id_domain, "%s@%s", username, domain);
 
+       aors_buf = ast_strdupa(aors);
+
        /* Look for exact match on username@domain */
-       configured_aors = ast_strdupa(aors);
+       configured_aors = aors_buf;
        while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                if (match_aor(aor_name, id_domain)) {
                        return ast_strdup(aor_name);
@@ -586,7 +589,7 @@ static char *find_aor_name(const char *username, const char *domain, const char
                sprintf(id_domain, "%s@%s", username, alias->domain);
                ao2_cleanup(alias);
 
-               configured_aors = ast_strdupa(aors);
+               configured_aors = strcpy(aors_buf, aors);/* Safe */
                while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                        if (match_aor(aor_name, id_domain_alias)) {
                                return ast_strdup(aor_name);
@@ -594,8 +597,13 @@ static char *find_aor_name(const char *username, const char *domain, const char
                }
        }
 
+       if (ast_strlen_zero(username)) {
+               /* No username, no match */
+               return NULL;
+       }
+
        /* Look for exact match on username only */
-       configured_aors = ast_strdupa(aors);
+       configured_aors = strcpy(aors_buf, aors);/* Safe */
        while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                if (match_aor(aor_name, username)) {
                        return ast_strdup(aor_name);