diff options
author | Eric Covener <covener@apache.org> | 2016-12-22 14:55:23 +0000 |
---|---|---|
committer | Eric Covener <covener@apache.org> | 2016-12-22 14:55:23 +0000 |
commit | 5cd3d6daee9008b8f2cde919d8c9a926956eb6f4 (patch) | |
tree | 3a9c6f18f986bdf2631c6a28ea8fb5be34f4c5f5 | |
parent | f8b61c1df288f660a63c4a4db0ede65624afec16 (diff) | |
download | httpd-5cd3d6daee9008b8f2cde919d8c9a926956eb6f4.tar.gz |
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
-rw-r--r-- | modules/http/http_filters.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c index 05c9ba4ddc..11b02f2f8b 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; |