summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2020-05-10 22:52:30 +0200
committerYann Ylavic <ylavic@apache.org>2020-05-10 22:52:30 +0200
commit66653545b240d8ca5c38c60c3da1e9655d338951 (patch)
treeccccb728c952110fa8cc9983df6691023c34092c
parentmpm_event: reset listener_is_wakeable on reload. (diff)
downloadapache2-66653545b240d8ca5c38c60c3da1e9655d338951.tar.xz
apache2-66653545b240d8ca5c38c60c3da1e9655d338951.zip
mod_proxy_http: single point of failure in ap_proxy_http_process_response().
No functional change (intended). git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1877557 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--modules/proxy/mod_proxy_http.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c
index 71c05e8998..989c47d7c5 100644
--- a/modules/proxy/mod_proxy_http.c
+++ b/modules/proxy/mod_proxy_http.c
@@ -1264,8 +1264,9 @@ int ap_proxy_http_process_response(proxy_http_req_t *req)
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_http_req_t *req)
/* 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_http_req_t *req)
* 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_http_req_t *req)
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_http_req_t *req)
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_http_req_t *req)
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_http_req_t *req)
}
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_http_req_t *req)
}
return OK;
+
+cleanup:
+ proxy_run_detach_backend(r, backend);
+ return proxy_status;
}
static