From 9a295fb59b3bdb92e468142ad1572729ce37ddf7 Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Wed, 13 Mar 2019 10:09:08 +0000 Subject: [PATCH] Merge of r1854004 from trunk: *) http: Fix possible empty response with mod_ratelimit for HEAD requests. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1855391 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 6 ++++++ STATUS | 6 ------ modules/http/http_filters.c | 20 ++++++++++++++------ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 6b560802119..3e8b82ce9a6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,9 +1,15 @@ -*- coding: utf-8 -*- Changes with Apache 2.4.39 + *) http: Fix possible empty response with mod_ratelimit for HEAD requests. + PR 63192. [Yann Ylavic] + *) MPMs unix: bind the bucket number of each child to its slot number, for a more efficient per bucket maintenance. [Yann Ylavic] + *) mod_cache_socache: Avoid reallocations and be safe with outgoing data + lifetime. [Yann Ylavic] + *) mod_auth_digest: Fix a race condition. Authentication with valid credentials could be refused in case of concurrent accesses from different users. PR 63124. [Simon Kappel ] diff --git a/STATUS b/STATUS index 2d38468b99f..e1351654a7f 100644 --- a/STATUS +++ b/STATUS @@ -126,12 +126,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - *) http: Fix possible empty response with mod_ratelimit for HEAD requests. - trunk patch: https://svn.apache.org/r1854004 - 2.4.x patch: svn merge -c 1854004 ^/httpd/httpd/trunk . - +1: elukey, ylavic, icing - ylavic: nice catch Luca, forgot about this one.. - PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c index 9828cdfcfbd..5fc44e542f2 100644 --- a/modules/http/http_filters.c +++ b/modules/http/http_filters.c @@ -1290,6 +1290,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, request_rec *r = f->r; conn_rec *c = r->connection; const char *clheader; + int header_only = (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status)); const char *protocol = NULL; apr_bucket *e; apr_bucket_brigade *b2; @@ -1307,7 +1308,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, } else if (ctx->headers_sent) { /* Eat body if response must not have one. */ - if (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status)) { + if (header_only) { /* Still next filters may be waiting for EOS, so pass it (alone) * when encountered and be done with this filter. */ @@ -1522,14 +1523,21 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, terminate_header(b2); - rv = ap_pass_brigade(f->next, b2); - if (rv != APR_SUCCESS) { - goto out; + if (header_only) { + e = APR_BRIGADE_LAST(b); + if (e != APR_BRIGADE_SENTINEL(b) && APR_BUCKET_IS_EOS(e)) { + APR_BUCKET_REMOVE(e); + APR_BRIGADE_INSERT_TAIL(b2, e); + ap_remove_output_filter(f); + } + apr_brigade_cleanup(b); } + + rv = ap_pass_brigade(f->next, b2); + apr_brigade_cleanup(b2); ctx->headers_sent = 1; - if (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status)) { - apr_brigade_cleanup(b); + if (rv != APR_SUCCESS || header_only) { goto out; } -- 2.47.3