aboutsummaryrefslogtreecommitdiffstats
path: root/main/utils.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-05-28 20:36:49 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-05-28 20:36:49 +0000
commit46db1ef34fdae9810185a8d997e85ea1125d3233 (patch)
treea1928db95830453834f6721711e8272d65ec63d3 /main/utils.c
parentf5e466a35f6f13c99d6644a2d322d4a1a9c54ce9 (diff)
Ensure that accidental calls to ast_string_field_free_memory() on embedded stringfield pools are safe.
It is possible for a stringfield manager structure (and pool) structure to be allocated as part of a larger structure allocation (using ast_calloc_with_strinfields()); when this is done, the stringfield pool cannot be separately freed, but users of the tructure may not be aware (and shouldn't have to be aware) of whether the pool was embedded. This patch modifies the behavior so that they can always call ast_string_field_free_memory() and the function will do the right thing for both embedded and non-embedded situations. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@197775 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/utils.c')
-rw-r--r--main/utils.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/main/utils.c b/main/utils.c
index fe2d083d5..4c0ff3aa8 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -1559,11 +1559,17 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, struct ast_string_
return add_string_pool(mgr, pool_head, needed, file, lineno, func);
}
+ /* if there is an embedded pool, we can't actually release *all*
+ * pools, we must keep the embedded one. if the caller is about
+ * to free the structure that contains the stringfield manager
+ * and embedded pool anyway, it will be freed as part of that
+ * operation.
+ */
+ if ((needed < 0) && mgr->embedded_pool) {
+ needed = 0;
+ }
+
if (needed < 0) { /* reset all pools */
- if (*pool_head == NULL) {
- ast_log(LOG_WARNING, "trying to reset empty pool\n");
- return -1;
- }
cur = *pool_head;
} else if (mgr->embedded_pool) { /* preserve the embedded pool */
preserve = mgr->embedded_pool;