summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2016-11-01 11:53:57 +0000
committerJim Jagielski <jim@apache.org>2016-11-01 11:53:57 +0000
commitc32f066785861dc966bce724220b818bf182b264 (patch)
tree0da0822422f5dc7d2fd07a069d6ab0895e9d1f8a
parent1cb62155d41b269332aef3a9067bc1940c115d42 (diff)
downloadhttpd-c32f066785861dc966bce724220b818bf182b264.tar.gz
Merge r1698239 from trunk:
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
-rw-r--r--CHANGES3
-rw-r--r--STATUS6
-rw-r--r--modules/http/http_request.c12
-rw-r--r--server/request.c13
4 files changed, 24 insertions, 10 deletions
diff --git a/CHANGES b/CHANGES
index 3e8c26de2f..2eae5b3edd 100644
--- 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 d06d6df3ca..bfdda73857 100644
--- 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
diff --git a/modules/http/http_request.c b/modules/http/http_request.c
index 9ce7b8b329..b2dc893d41 100644
--- a/modules/http/http_request.c
+++ b/modules/http/http_request.c
@@ -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 {
/*
diff --git a/server/request.c b/server/request.c
index eecc0266b1..6eb14d591c 100644
--- a/server/request.c
+++ b/server/request.c
@@ -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