Fix seg in variable replacement (bug #3464)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4930 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
fda3016dc8
commit
7cd91c85fa
56
config.c
56
config.c
|
@ -124,59 +124,13 @@ struct ast_variable *ast_variable_new(const char *name, const char *value)
|
|||
return variable;
|
||||
}
|
||||
|
||||
static struct ast_variable *variable_get(const struct ast_category *category, const char *name)
|
||||
{
|
||||
struct ast_variable *variable;
|
||||
|
||||
for (variable = category->root; variable; variable = variable->next)
|
||||
if (!strcasecmp(variable->name, name))
|
||||
return variable;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void variable_remove(struct ast_category *category, const struct ast_variable *variable)
|
||||
{
|
||||
struct ast_variable *prev = category->root;
|
||||
|
||||
if (!prev)
|
||||
return;
|
||||
|
||||
if (prev == variable) {
|
||||
category->root = prev->next;
|
||||
if (category->last == variable)
|
||||
category->last = NULL;
|
||||
} else {
|
||||
while (prev->next && (prev->next != variable)) prev = prev->next;
|
||||
if (prev->next) {
|
||||
prev->next = variable->next;
|
||||
if (category->last == variable)
|
||||
category->last = prev;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
|
||||
{
|
||||
/* Note: this function also implements "variable replacement"... if the
|
||||
new variable's value is empty, then existing variables of the same
|
||||
name in the category are removed (and the new variable is destroyed)
|
||||
*/
|
||||
if (variable->value && !ast_strlen_zero(variable->value)) {
|
||||
if (category->last)
|
||||
category->last->next = variable;
|
||||
else
|
||||
category->root = variable;
|
||||
category->last = variable;
|
||||
} else {
|
||||
struct ast_variable *v;
|
||||
|
||||
while ((v = variable_get(category, variable->name))) {
|
||||
variable_remove(category, v);
|
||||
ast_variables_destroy(v);
|
||||
}
|
||||
ast_variables_destroy(variable);
|
||||
}
|
||||
if (category->last)
|
||||
category->last->next = variable;
|
||||
else
|
||||
category->root = variable;
|
||||
category->last = variable;
|
||||
}
|
||||
|
||||
void ast_variables_destroy(struct ast_variable *v)
|
||||
|
|
Loading…
Reference in New Issue