From: Ruediger Pluem Date: Sat, 11 Apr 2009 19:49:12 +0000 (+0000) Subject: * Check more strictly that the backend follows the AJP protocol. X-Git-Tag: 2.3.3~727 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1704a794773e67b6ca108b54caa5609847b0b805;p=thirdparty%2Fapache%2Fhttpd.git * Check more strictly that the backend follows the AJP protocol. Submitted by: mturk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@764239 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 3c197f611d1..609747febc4 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,9 @@ Changes with Apache 2.3.3 mod_proxy_ajp: Avoid delivering content from a previous request which failed to send a request body. PR 46949 [Ruediger Pluem] + *) mod_proxy_ajp: Check more strictly that the backend follows the AJP + protocol. [Mladen Turk] + *) mod_proxy_ajp: Forward remote port information by default. [Rainer Jung] diff --git a/modules/proxy/mod_proxy_ajp.c b/modules/proxy/mod_proxy_ajp.c index 613ec31ba1e..d2389474e1a 100644 --- a/modules/proxy/mod_proxy_ajp.c +++ b/modules/proxy/mod_proxy_ajp.c @@ -180,6 +180,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, int backend_failed = 0; apr_off_t bb_len; int data_sent = 0; + int request_ended = 0; int headers_sent = 0; int rv = 0; apr_int32_t conn_poll_fd; @@ -415,6 +416,15 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, } break; case CMD_AJP13_SEND_HEADERS: + if (headers_sent) { + /* Do not send anything to the client. + * Backend already send us the headers. + */ + backend_failed = 1; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: Backend sent headers twice."); + break; + } /* AJP13_SEND_HEADERS: process them */ status = ajp_parse_header(r, conf, conn->data); if (status != APR_SUCCESS) { @@ -480,6 +490,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, } /* XXX: what about flush here? See mod_jk */ data_sent = 1; + request_ended = 1; break; default: backend_failed = 1; @@ -536,6 +547,17 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, rv = DONE; } } + else if (!request_ended) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: Processing of request didn't terminate cleanly"); + /* We had a failure: Close connection to backend */ + conn->close++; + backend_failed = 1; + /* Return DONE to avoid error messages being added to the stream */ + if (data_sent) { + rv = DONE; + } + } else { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: got response from %pI (%s)",