Commit 26ae36eb authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Merge r1698334 from trunk:

Avoid adding duplicate subequest filters, as they would not be stripped
properly during an ap_internal_fast_redirect.


Submitted by: covener
Reviewed/backported by: jim


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1770672 13f79535-47bb-0310-9956-ffa450edef68
parent 4d5d5a30
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@

Changes with Apache 2.4.24

  *) mod_dir: Responses that go through "FallbackResource" might appear to
     hang due to unterminated chunked encoding. PR58292. [Eric Covener]

  *) mod_dav: Fix a potential cause of unbounded memory usage or incorrect
     behavior in a routine that sends <DAV:response>'s to the output filters.
     [Evgeny Kotkov]
+0 −6
Original line number Diff line number Diff line
@@ -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/r1698334
     2.4.x patch:  trunk works modulo CHANGES
     +1:  covener, jim, jchampion

  *) ssl: clear the error queue before SSL_read/write/accept(). PR60223
     trunk patch: http://svn.apache.org/r1769332
     2.4.x patch: https://home.apache.org/~jchampion/patches/2.4.x-ssl-error-queue.patch
+11 −2
Original line number Diff line number Diff line
@@ -711,9 +711,18 @@ 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_filter_t *next = r->output_filters;
        while (next && (next != r->proto_output_filters)) {
            if (next->frec == ap_subreq_core_filter_handle) {
                break;
            }
            next = next->next;
        }
        if (!next || next == r->proto_output_filters) {
            ap_add_output_filter_handle(ap_subreq_core_filter_handle,
                                        NULL, r, r->connection);
        }
    }
    else {
        /*
         * We need to check if we now have the SUBREQ_CORE filter in our filter
+12 −2
Original line number Diff line number Diff line
@@ -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,9 +1970,17 @@ 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;
        while (scan && (scan != r->proto_output_filters)) {
            if (scan->frec == ap_subreq_core_filter_handle) {
                break;
            }
            scan = scan->next;
        }
        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
         * to this subrequest - or this request will never be invoked.