diff --git a/modules/generators/mod_cgi.c b/modules/generators/mod_cgi.c index 89d833a8c1..66fbe5f401 100644 --- a/modules/generators/mod_cgi.c +++ b/modules/generators/mod_cgi.c @@ -905,10 +905,7 @@ static int cgi_handler(request_rec *r) apr_file_pipe_timeout_set(script_in, 0); apr_file_pipe_timeout_set(script_err, 0); - /* if r is a subrequest, ensure that the bucket only references - * r->main, since it may last longer than the subreq. */ - b = cgi_bucket_create(r->main ? r->main : r, script_in, script_err, - c->bucket_alloc); + b = cgi_bucket_create(r, script_in, script_err, c->bucket_alloc); #else b = apr_bucket_pipe_create(script_in, c->bucket_alloc); #endif diff --git a/server/util_filter.c b/server/util_filter.c index 05c81063b4..a294248248 100644 --- a/server/util_filter.c +++ b/server/util_filter.c @@ -546,10 +546,21 @@ AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, e = APR_BUCKET_NEXT(e)) { rv = apr_bucket_setaside(e, p); - if (rv != APR_SUCCESS - /* ### this ENOTIMPL will go away once we implement setaside - ### for all bucket types. */ - && rv != APR_ENOTIMPL) { + + /* If the bucket type does not implement setaside, then + * (hopefully) morph it into a bucket type which does, and set + * *that* aside... */ + if (rv == APR_ENOTIMPL) { + const char *s; + apr_size_t n; + + rv = apr_bucket_read(e, &s, &n, APR_BLOCK_READ); + if (rv == APR_SUCCESS) { + rv = apr_bucket_setaside(e, p); + } + } + + if (rv != APR_SUCCESS) { return rv; } }