diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-09-13 13:54:15 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-09-13 13:54:15 +0000 |
commit | 5d19839a33b1a32877f72651ad015c4d84387b63 (patch) | |
tree | d9167154888da9a9e9ba16dc38c14b8e5a9723f3 /channels/iax2-parser.c | |
parent | 95bae857590d3ca7e1bb44f384014d691442eb00 (diff) |
Repair IAXVAR implementation so that it works again (regression?)
(closes issue #13354)
Reported by: adomjan
Patches:
20080828__bug13354.diff.txt uploaded by Corydon76 (license 14)
20080829__bug13354__1.6.0.diff.txt uploaded by Corydon76 (license 14)
Tested by: Corydon76, adomjan
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@143031 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/iax2-parser.c')
-rw-r--r-- | channels/iax2-parser.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index 342792231..b9af6fd6e 100644 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -923,24 +923,32 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) *tmp2++ = '\0'; else tmp2 = ""; - /* Existing variable or new variable? */ - for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { - if (strcmp(tmp, var2->name) == 0) { - int length = strlen(var2->value) + strlen(tmp2) + 1; - char *tmp3 = alloca(length); - snprintf(tmp3, length, "%s%s", var2->value, tmp2); - var = ast_variable_new(tmp, tmp3, var2->file); - var->next = var2->next; - if (prev) - prev->next = var; - else - ies->vars = var; - ast_free(var2); - break; + { + struct ast_str *str = ast_str_create(16); + /* Existing variable or new variable? */ + for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { + if (strcmp(tmp, var2->name) == 0) { + ast_str_set(&str, 0, "%s%s", var2->value, tmp2); + var = ast_variable_new(tmp, str->str, var2->file); + var->next = var2->next; + if (prev) { + prev->next = var; + } else { + ies->vars = var; + } + snprintf(tmp, sizeof(tmp), "Assigned (%p)%s to (%p)%s\n", var->name, var->name, var->value, var->value); + errorf(tmp); + ast_free(var2); + break; + } } + ast_free(str); } + if (!var2) { var = ast_variable_new(tmp, tmp2, ""); + snprintf(tmp, sizeof(tmp), "Assigned (%p)%s to (%p)%s\n", var->name, var->name, var->value, var->value); + errorf(tmp); var->next = ies->vars; ies->vars = var; } |