From 5cd3d6daee9008b8f2cde919d8c9a926956eb6f4 Mon Sep 17 00:00:00 2001 From: Eric Covener Date: Thu, 22 Dec 2016 14:55:23 +0000 Subject: [PATCH] Merge r1774286 from trunk: Follow up to r1773761: restore EOC semantic. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x-merge-http-strict@1775671 13f79535-47bb-0310-9956-ffa450edef68 --- modules/http/http_filters.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c index 05c9ba4ddc9..11b02f2f8bb 100644 --- a/modules/http/http_filters.c +++ b/modules/http/http_filters.c @@ -744,13 +744,10 @@ static APR_INLINE int check_headers(request_rec *r) static int check_headers_recursion(request_rec *r) { - request_rec *rr; - for (rr = r; rr; rr = rr->prev) { - void *dying = NULL; - apr_pool_userdata_get(&dying, "check_headers_recursion", rr->pool); - if (dying) { - return 1; - } + void *check = NULL; + apr_pool_userdata_get(&check, "check_headers_recursion", r->pool); + if (check) { + return 1; } apr_pool_userdata_setn("true", "check_headers_recursion", NULL, r->pool); return 0; @@ -1263,7 +1260,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, header_filter_ctx *ctx = f->ctx; const char *ctype; ap_bucket_error *eb = NULL; - int eos = 0; + apr_bucket *eos = NULL; AP_DEBUG_ASSERT(!r->main); @@ -1284,13 +1281,6 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, e != APR_BRIGADE_SENTINEL(b); e = APR_BUCKET_NEXT(e)) { - if (ctx->headers_error) { - if (APR_BUCKET_IS_EOS(e)) { - eos = 1; - break; - } - continue; - } if (AP_BUCKET_IS_ERROR(e) && !eb) { eb = e->data; continue; @@ -1303,6 +1293,9 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, ap_remove_output_filter(f); return ap_pass_brigade(f->next, b); } + if (ctx->headers_error && APR_BUCKET_IS_EOS(e)) { + eos = e; + } } if (ctx->headers_error) { if (!eos) { @@ -1328,10 +1321,9 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, ap_die(HTTP_INTERNAL_SERVER_ERROR, r); return AP_FILTER_ERROR; } - AP_DEBUG_ASSERT(APR_BUCKET_IS_EOS(e)); - APR_BUCKET_REMOVE(e); + APR_BUCKET_REMOVE(eos); apr_brigade_cleanup(b); - APR_BRIGADE_INSERT_TAIL(b, e); + APR_BRIGADE_INSERT_TAIL(b, eos); r->status = HTTP_INTERNAL_SERVER_ERROR; r->content_type = r->content_encoding = NULL; r->content_languages = NULL; -- 2.47.2