]> granicus.if.org Git - apache/commitdiff
Merge r1698239 from trunk:
authorJim Jagielski <jim@apache.org>
Tue, 1 Nov 2016 11:53:57 +0000 (11:53 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 1 Nov 2016 11:53:57 +0000 (11:53 +0000)
Submitted by: covener
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1767482 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
modules/http/http_request.c
server/request.c

diff --git a/CHANGES b/CHANGES
index 3e8c26de2f191ef61ebd407e1d0eac3de2457b14..2eae5b3edd2d6e56c2962d5dde229234dcae7e15 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.4.24
 
+  *) core: avoid adding multiple subrequest filters when there are nested
+     subrequests.  PR58292
+
   *) mod_http2: connection shutdown revisited: corrected edge cases on
      shutting down ongoing streams, changed log warnings to be less noisy
      when waiting on long running tasks. [Stefan Eissing]
diff --git a/STATUS b/STATUS
index d06d6df3ca627df63a9bd3c1c4ee9943cc57ea4a..bfdda7385753d454deacfc0bc038583656f0f9cb 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -117,12 +117,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-  *) core: avoid adding multiple subrequest filters when there are nested 
-     subrequests.  PR58292
-     trunk patch: http://svn.apache.org/r1698239
-     2.4.x patch: trunk works
-     +1: covener, ylavic, jim
-
   *) mod_remoteip: Pick up where we left off during a subrequest rather
      than running with the modified XFF but original TCP address. PR49839/PR60251
      trunk patch: http://svn.apache.org/r1688399  
index 9ce7b8b32987fadd5e7ffd24b349943b293340ab..b2dc893d41f1af17b59941c27a8ec532010bdcc7 100644 (file)
@@ -711,8 +711,16 @@ AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *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);
+        ap_filter_t *next = r->output_filters;
+        while (next && (next != r->proto_output_filters)) {
+            if (next->frec == ap_subreq_core_filter_handle) {
+                break;
+            }
+        }
+        if (!next || next == r->proto_output_filters) {
+            ap_add_output_filter_handle(ap_subreq_core_filter_handle,
+                                        NULL, r, r->connection);
+        }
     }
     else {
         /*
index eecc0266b15a99b7e5fbd73f26a8e084e7e9aa6a..6eb14d591c0277cfc46af3dbb98bb19e3384a081 100644 (file)
@@ -1960,6 +1960,8 @@ static request_rec *make_sub_request(const request_rec *r,
 
     /* start with the same set of output filters */
     if (next_filter) {
+        ap_filter_t *scan = next_filter;
+
         /* while there are no input filters for a subrequest, we will
          * try to insert some, so if we don't have valid data, the code
          * will seg fault.
@@ -1968,8 +1970,15 @@ static request_rec *make_sub_request(const request_rec *r,
         rnew->proto_input_filters = r->proto_input_filters;
         rnew->output_filters = next_filter;
         rnew->proto_output_filters = r->proto_output_filters;
-        ap_add_output_filter_handle(ap_subreq_core_filter_handle,
-                                    NULL, rnew, rnew->connection);
+        while (scan && (scan != r->proto_output_filters)) {
+            if (scan->frec == ap_subreq_core_filter_handle) {
+                break;
+            }
+        }
+        if (!scan || scan == r->proto_output_filters) {
+            ap_add_output_filter_handle(ap_subreq_core_filter_handle,
+                    NULL, rnew, rnew->connection);
+        }
     }
     else {
         /* If NULL - we are expecting to be internal_fast_redirect'ed