summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buckets/apr_brigade.c20
-rw-r--r--include/apr_buckets.h7
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)