mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
Hopefully the final fix for the subreq/filter issue. The
prob was that we at this point could still have some stale and incorrect refs when we adjusted the f-stack. So move the update earlier so when we adjust, we're affecting r. Rdiger and Jim pretty much simultaneously :) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@725077 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -518,6 +518,15 @@ AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *r)
|
|||||||
r->output_filters = rr->output_filters;
|
r->output_filters = rr->output_filters;
|
||||||
r->input_filters = rr->input_filters;
|
r->input_filters = rr->input_filters;
|
||||||
|
|
||||||
|
/* If any filters pointed at the now-defunct rr, we must point them
|
||||||
|
* at our "new" instance of r. In particular, some of rr's structures
|
||||||
|
* will now be bogus (say rr->headers_out). If a filter tried to modify
|
||||||
|
* their f->r structure when it is pointing to rr, the real request_rec
|
||||||
|
* will not get updated. Fix that here.
|
||||||
|
*/
|
||||||
|
update_r_in_filters(r->input_filters, rr, r);
|
||||||
|
update_r_in_filters(r->output_filters, rr, r);
|
||||||
|
|
||||||
if (r->main) {
|
if (r->main) {
|
||||||
ap_add_output_filter_handle(ap_subreq_core_filter_handle,
|
ap_add_output_filter_handle(ap_subreq_core_filter_handle,
|
||||||
NULL, r, r->connection);
|
NULL, r, r->connection);
|
||||||
@@ -541,20 +550,8 @@ AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *r)
|
|||||||
}
|
}
|
||||||
if (next && (next->frec == ap_subreq_core_filter_handle)) {
|
if (next && (next->frec == ap_subreq_core_filter_handle)) {
|
||||||
ap_remove_output_filter(next);
|
ap_remove_output_filter(next);
|
||||||
if (next == r->output_filters) {
|
|
||||||
r->output_filters = r->output_filters->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* If any filters pointed at the now-defunct rr, we must point them
|
|
||||||
* at our "new" instance of r. In particular, some of rr's structures
|
|
||||||
* will now be bogus (say rr->headers_out). If a filter tried to modify
|
|
||||||
* their f->r structure when it is pointing to rr, the real request_rec
|
|
||||||
* will not get updated. Fix that here.
|
|
||||||
*/
|
|
||||||
update_r_in_filters(r->input_filters, rr, r);
|
|
||||||
update_r_in_filters(r->output_filters, rr, r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r)
|
AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r)
|
||||||
|
Reference in New Issue
Block a user