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 2020/05/10 20:52:30 UTC

svn commit: r1877557 - /httpd/httpd/trunk/modules/proxy/mod_proxy_http.c

Author: ylavic
Date: Sun May 10 20:52:30 2020
New Revision: 1877557

URL: http://svn.apache.org/viewvc?rev=1877557&view=rev
Log:
mod_proxy_http: single point of failure in ap_proxy_http_process_response().

No functional change (intended).

Modified:
    httpd/httpd/trunk/modules/proxy/mod_proxy_http.c

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_http.c?rev=1877557&r1=1877556&r2=1877557&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_http.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_http.c Sun May 10 20:52:30 2020
@@ -1264,8 +1264,9 @@ int ap_proxy_http_process_response(proxy
                 apr_table_setn(r->notes, "proxy_timedout", "1");
                 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01103) "read timeout");
                 if (do_100_continue) {
-                    proxy_run_detach_backend(r, backend);
-                    return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, "Timeout on 100-Continue");
+                    proxy_status = ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE,
+                                                 "Timeout on 100-Continue");
+                    goto cleanup;
                 }
             }
             /*
@@ -1297,19 +1298,19 @@ int ap_proxy_http_process_response(proxy
                 /* Mark the backend connection for closing */
                 backend->close = 1;
                 /* Need to return OK to avoid sending an error message */
-                proxy_run_detach_backend(r, backend);
-                return OK;
+                proxy_status = OK;
+                goto cleanup;
             }
-            else if (!c->keepalives) {
-                     ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01105)
-                                   "NOT Closing connection to client"
-                                   " although reading from backend server %s:%d"
-                                   " failed.",
-                                   backend->hostname, backend->port);
+            if (!c->keepalives) {
+                ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01105)
+                              "NOT Closing connection to client"
+                              " although reading from backend server %s:%d"
+                              " failed.",
+                              backend->hostname, backend->port);
             }
-            proxy_run_detach_backend(r, backend);
-            return ap_proxyerror(r, HTTP_GATEWAY_TIME_OUT,
-                                 "Error reading from remote server");
+            proxy_status = ap_proxyerror(r, HTTP_GATEWAY_TIME_OUT,
+                                         "Error reading from remote server");
+            goto cleanup;
         }
         /* XXX: Is this a real headers length send from remote? */
         backend->worker->s->read += len;
@@ -1325,10 +1326,11 @@ int ap_proxy_http_process_response(proxy
              * if the status line was > 8192 bytes
              */
             if ((major != 1) || (len >= response_field_size - 1)) {
-                proxy_run_detach_backend(r, backend);
-                return ap_proxyerror(r, HTTP_BAD_GATEWAY,
-                apr_pstrcat(p, "Corrupt status line returned by remote "
-                            "server: ", buffer, NULL));
+                proxy_status = ap_proxyerror(r, HTTP_BAD_GATEWAY,
+                                   apr_pstrcat(p, "Corrupt status line "
+                                               "returned by remote server: ",
+                                               buffer, NULL));
+                goto cleanup;
             }
             backasswards = 0;
 
@@ -1384,8 +1386,8 @@ int ap_proxy_http_process_response(proxy
                 r->headers_out = apr_table_make(r->pool,1);
                 r->status = HTTP_BAD_GATEWAY;
                 r->status_line = "bad gateway";
-                proxy_run_detach_backend(r, backend);
-                return r->status;
+                proxy_status = r->status;
+                goto cleanup;
             }
 
             /* Now, add in the just read cookies */
@@ -1431,9 +1433,9 @@ int ap_proxy_http_process_response(proxy
             if (toclose) {
                 backend->close = 1;
                 if (toclose < 0) {
-                    proxy_run_detach_backend(r, backend);
-                    return ap_proxyerror(r, HTTP_BAD_GATEWAY,
-                                         "Malformed connection header");
+                    proxy_status = ap_proxyerror(r, HTTP_BAD_GATEWAY,
+                                                 "Malformed connection header");
+                    goto cleanup;
                 }
             }
 
@@ -1598,8 +1600,8 @@ int ap_proxy_http_process_response(proxy
                             c->remote_host ? c->remote_host : "",
                             status);
                     backend->close = 1;
-                    proxy_run_detach_backend(r, backend);
-                    return status;
+                    proxy_status = status;
+                    goto cleanup;
                 }
             }
             else {
@@ -1664,13 +1666,12 @@ int ap_proxy_http_process_response(proxy
                 }
                 ap_discard_request_body(backend->r);
             }
-            proxy_run_detach_backend(r, backend);
             /*
              * prevent proxy_handler() from treating this as an
              * internal error.
              */
             apr_table_setn(r->notes, "proxy-error-override", "1");
-            return proxy_status;
+            goto cleanup;
         }
 
         r->sent_bodyct = 1;
@@ -1929,6 +1930,10 @@ int ap_proxy_http_process_response(proxy
     }
 
     return OK;
+
+cleanup:
+    proxy_run_detach_backend(r, backend);
+    return proxy_status;
 }
 
 static