summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2016-09-06 21:58:50 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-09-06 21:58:50 -0500
commit9e874d2cc8c3884746432dc0d2947caffeb0b93e (patch)
treeca3f58c7f80581fe0e7297761d8c4da8edfc454f /res
parent6de392eb173aa1ac89795eb4702be38de2fa4565 (diff)
parent03fc438f6eaebf736edb2be8cb7314afed6ca689 (diff)
Merge "res_pjsip_registrar.c: Reduce stack usage in find_aor_name()." into 13
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_registrar.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c
index 53209575f..1e0f5ab72 100644
--- a/res/res_pjsip_registrar.c
+++ b/res/res_pjsip_registrar.c
@@ -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);