diff --git a/chanvars.c b/chanvars.c index dabfdda51bf307615fb3b0314e107a8cb224807b..2f23c4dd11898d0e402cf3f82d5cb55179d6994c 100755 --- a/chanvars.c +++ b/chanvars.c @@ -21,8 +21,14 @@ struct ast_var_t *ast_var_assign(const char *name, const char *value) { int i; struct ast_var_t *var; + int len; - var = malloc(sizeof(struct ast_var_t)); + len = sizeof(struct ast_var_t); + + len += strlen(name) + 1; + len += strlen(value) + 1; + + var = malloc(len); if (var == NULL) { @@ -30,41 +36,22 @@ struct ast_var_t *ast_var_assign(const char *name, const char *value) return NULL; } - i = strlen(value); - var->value = malloc(i + 1); - if (var->value == NULL) - { - ast_log(LOG_WARNING, "Out of memory\n"); - free(var); - return NULL; - } - - strncpy(var->value, value, i); - var->value[i] = '\0'; - i = strlen(name); - var->name = malloc(i + 1); - if (var->name == NULL) - { - ast_log(LOG_WARNING, "Out of memory\n"); - free(var->value); - free(var); - return NULL; - } - strncpy(var->name, name, i); var->name[i] = '\0'; + var->value = var->name + i + 1; + + i = strlen(value); + strncpy(var->value, value, i); + var->value[i] = '\0'; + return var; } void ast_var_delete(struct ast_var_t *var) { if (var == NULL) return; - - if (var->name != NULL) free(var->name); - if (var->value != NULL) free(var->value); - free(var); } diff --git a/include/asterisk/chanvars.h b/include/asterisk/chanvars.h index 4e0ecc6a64a99c7ef1c1d279d63d0505772b2a96..f6b4f813dbd65a0fba40bab9888f942e8f2db2c3 100755 --- a/include/asterisk/chanvars.h +++ b/include/asterisk/chanvars.h @@ -17,9 +17,9 @@ #include <asterisk/linkedlists.h> struct ast_var_t { - char *name; - char *value; AST_LIST_ENTRY(ast_var_t) entries; + char *value; + char name[0]; }; struct ast_var_t *ast_var_assign(const char *name, const char *value);