diff options
-rw-r--r-- | buckets/apr_brigade.c | 20 | ||||
-rw-r--r-- | include/apr_buckets.h | 7 |
2 files changed, 23 insertions, 4 deletions
diff --git a/buckets/apr_brigade.c b/buckets/apr_brigade.c index 4519f6419..2b5893077 100644 --- a/buckets/apr_brigade.c +++ b/buckets/apr_brigade.c @@ -39,6 +39,8 @@ APR_DECLARE(apr_status_t) apr_brigade_cleanup(void *data) apr_bucket_brigade *b = data; apr_bucket *e; + APR_BRIGADE_CHECK_CONSISTENCY(b); + while (!APR_BRIGADE_EMPTY(b)) { e = APR_BRIGADE_FIRST(b); apr_bucket_delete(e); @@ -49,8 +51,22 @@ APR_DECLARE(apr_status_t) apr_brigade_cleanup(void *data) APR_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b) { - apr_pool_cleanup_kill(b->p, b, brigade_cleanup); - return apr_brigade_cleanup(b); +#ifndef APR_BUCKET_DEBUG + return apr_pool_cleanup_run(b->p, b, brigade_cleanup); +#else + apr_status_t rv; + + APR_BRIGADE_CHECK_CONSISTENCY(b); + + rv = apr_pool_cleanup_run(b->p, b, brigade_cleanup); + + /* Trigger consistency check failures if the brigade is + * re-used. */ + b->p = NULL; + b->bucket_alloc = NULL; + + return rv; +#endif } APR_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p, diff --git a/include/apr_buckets.h b/include/apr_buckets.h index c900934e7..18453ce79 100644 --- a/include/apr_buckets.h +++ b/include/apr_buckets.h @@ -288,8 +288,11 @@ typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx); */ #ifdef APR_BUCKET_DEBUG -#define APR_BRIGADE_CHECK_CONSISTENCY(b) \ - APR_RING_CHECK_CONSISTENCY(&(b)->list, apr_bucket, link) +#define APR_BRIGADE_CHECK_CONSISTENCY(b) do { \ + APR_RING_CHECK_CONSISTENCY(&(b)->list, apr_bucket, link); \ + assert(b->p != NULL); \ + assert(b->bucket_alloc != NULL); \ +} while (0) #define APR_BUCKET_CHECK_CONSISTENCY(e) \ APR_RING_CHECK_ELEM_CONSISTENCY((e), apr_bucket, link) |