You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2016/12/12 19:39:17 UTC

svn commit: r1773861 - /httpd/httpd/trunk/modules/http/http_filters.c

Author: ylavic
Date: Mon Dec 12 19:39:17 2016
New Revision: 1773861

URL: http://svn.apache.org/viewvc?rev=1773861&view=rev
Log:
Follow up to r1773761: don't recurse on ap_send_error_response() either.

Modified:
    httpd/httpd/trunk/modules/http/http_filters.c

Modified: httpd/httpd/trunk/modules/http/http_filters.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http/http_filters.c?rev=1773861&r1=1773860&r2=1773861&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/http_filters.c (original)
+++ httpd/httpd/trunk/modules/http/http_filters.c Mon Dec 12 19:39:17 2016
@@ -1192,6 +1192,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
     header_filter_ctx *ctx = f->ctx;
     const char *ctype;
     ap_bucket_error *eb = NULL;
+    void *dying = NULL;
     int eos = 0;
 
     AP_DEBUG_ASSERT(!r->main);
@@ -1199,7 +1200,6 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
     if (!ctx) {
         ctx = f->ctx = apr_pcalloc(r->pool, sizeof(header_filter_ctx));
     }
-
     if (ctx->headers_sent) {
         /* Eat body if response must not have one. */
         if (r->header_only || r->status == HTTP_NO_CONTENT) {
@@ -1208,6 +1208,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
         }
     }
     else if (!ctx->headers_error && !check_headers(r)) {
+        apr_pool_userdata_get(&dying, "http_header_filter_dying", r->pool);
         ctx->headers_error = 1;
     }
     for (e = APR_BRIGADE_FIRST(b);
@@ -1252,8 +1253,10 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
          * otherwise we can end up in infinite recursion, better fall through
          * with 500, minimal headers and an empty body (EOS only).
          */
-        if (ap_is_initial_req(r)) {
+        if (!dying) {
             apr_brigade_cleanup(b);
+            apr_pool_userdata_setn("true", "http_header_filter_dying",
+                                   apr_pool_cleanup_null, r->pool);
             ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
             return AP_FILTER_ERROR;
         }