diff options
author | Stefan Fritsch <sf@apache.org> | 2013-01-19 17:04:50 +0000 |
---|---|---|
committer | Stefan Fritsch <sf@apache.org> | 2013-01-19 17:04:50 +0000 |
commit | 3b87c3b9d7254467d8f3e8da3591bcddbf00582f (patch) | |
tree | 9b77c80daa2772c9c369a043a27297dea431a668 /buckets | |
parent | 880b63861c28d20d680cfe19597e0c912bb19f20 (diff) | |
download | apr-3b87c3b9d7254467d8f3e8da3591bcddbf00582f.tar.gz |
Revert r789061, r758414, and r758398 which are leftovers of the palloc uses
malloc experiment that were forgotten when reverting to the old code in
r795598.
This fixes the apr_allocator created by apr_bucket_alloc_create() being leaked
by apr_bucket_alloc_destroy.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1435605 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'buckets')
-rw-r--r-- | buckets/apr_buckets_alloc.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/buckets/apr_buckets_alloc.c b/buckets/apr_buckets_alloc.c index 8cdf703dd..c73c7db35 100644 --- a/buckets/apr_buckets_alloc.c +++ b/buckets/apr_buckets_alloc.c @@ -47,22 +47,37 @@ static apr_status_t alloc_cleanup(void *data) apr_allocator_free(list->allocator, list->blocks); - apr_allocator_destroy(list->allocator); +#if APR_POOL_DEBUG + if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) { + apr_allocator_destroy(list->allocator); + } +#endif return APR_SUCCESS; } APR_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p) { - apr_allocator_t *allocator; + apr_allocator_t *allocator = apr_pool_allocator_get(p); apr_bucket_alloc_t *list; - if (apr_allocator_create(&allocator) != APR_SUCCESS - || (list = apr_bucket_alloc_create_ex(allocator)) == NULL) { - apr_abortfunc_t fn = apr_pool_abort_get(p); - if (fn) - (fn)(APR_ENOMEM); - abort(); +#if APR_POOL_DEBUG + /* may be NULL for debug mode. */ + if (allocator == NULL) { + if (apr_allocator_create(&allocator) != APR_SUCCESS) { + apr_abortfunc_t fn = apr_pool_abort_get(p); + if (fn) + (fn)(APR_ENOMEM); + abort(); + } + } +#endif + list = apr_bucket_alloc_create_ex(allocator); + if (list == NULL) { + apr_abortfunc_t fn = apr_pool_abort_get(p); + if (fn) + (fn)(APR_ENOMEM); + abort(); } list->pool = p; apr_pool_cleanup_register(list->pool, list, alloc_cleanup, @@ -99,6 +114,11 @@ APR_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list) apr_allocator_free(list->allocator, list->blocks); +#if APR_POOL_DEBUG + if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) { + apr_allocator_destroy(list->allocator); + } +#endif } APR_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, |