void *ctx)
{
ap_filter_t *f = ctx;
+ apr_status_t rv;
- return ap_pass_brigade(f, bb);
+ rv = ap_pass_brigade(f, bb);
+
+ /* apr_brigade_write et all require that the flush callback
+ * ensures the brigade is empty upon return; otherwise the brigade
+ * may be left with a transient bucket whose contents have fallen
+ * out of scope. Call cleanup here unconditionally, to avoid the
+ * issue even in error cases where some filter fails and leaves a
+ * non-empty brigade. */
+ apr_brigade_cleanup(bb);
+
+ return rv;
}
AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb)