diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/utils.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/main/utils.c b/main/utils.c index 74ecfaf57..8906eff11 100644 --- a/main/utils.c +++ b/main/utils.c @@ -1223,6 +1223,7 @@ static int add_string_pool(struct ast_string_field_mgr *mgr, size_t size) mgr->size = size; mgr->space = size; mgr->used = 0; + mgr->last_alloc = NULL; return 0; } @@ -1259,12 +1260,36 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr result = mgr->pool->base + mgr->used; mgr->used += needed; mgr->space -= needed; + mgr->last_alloc = result; return result; } +int __ast_string_field_index_grow(struct ast_string_field_mgr *mgr, size_t needed, + ast_string_field *fields, int index) +{ + int grow = needed - (strlen(fields[index]) + 1); + + if (grow <= 0) { + return 0; + } + + if (fields[index] != mgr->last_alloc) { + return 1; + } + + if (mgr->space < grow) { + return 1; + } + + mgr->space -= grow; + mgr->used += grow; + + return 0; +} + void __ast_string_field_index_build_va(struct ast_string_field_mgr *mgr, - ast_string_field *fields, int num_fields, - int index, const char *format, va_list ap1, va_list ap2) + ast_string_field *fields, int num_fields, + int index, const char *format, va_list ap1, va_list ap2) { size_t needed; @@ -1285,6 +1310,7 @@ void __ast_string_field_index_build_va(struct ast_string_field_mgr *mgr, } fields[index] = mgr->pool->base + mgr->used; + mgr->last_alloc = fields[index]; mgr->used += needed; mgr->space -= needed; } |