]> granicus.if.org Git - apache/commitdiff
Hopefully the final fix for the subreq/filter issue. The
authorJim Jagielski <jim@apache.org>
Wed, 10 Dec 2008 13:01:31 +0000 (13:01 +0000)
committerJim Jagielski <jim@apache.org>
Wed, 10 Dec 2008 13:01:31 +0000 (13:01 +0000)
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. R\9fdiger and Jim pretty much
simultaneously :)

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@725077 13f79535-47bb-0310-9956-ffa450edef68

modules/http/http_request.c

index fed313bee93f758be4d4e075d34b45c55c16cce5..4da05d2ba00b62c05dc1a20a08378cbc77284da8 100644 (file)
@@ -518,6 +518,15 @@ AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *r)
     r->output_filters = rr->output_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) {
         ap_add_output_filter_handle(ap_subreq_core_filter_handle,
                                     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)) {
             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)