From: Jeff Trawick Date: Sat, 21 Sep 2013 18:48:20 +0000 (+0000) Subject: Borrow a fix from mod_authnz_fcgi: X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bdba3f34168333692a9d46c7fcb461f139cf250d;p=thirdparty%2Fapache%2Fhttpd.git Borrow a fix from mod_authnz_fcgi: mod_proxy_fcgi: Handle reading protocol data that is split between packets. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1525280 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index a0872d41ffc..b91572e45cd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_proxy_fcgi: Handle reading protocol data that is split between + packets. [Jeff Trawick] + *) mod_proxy_fcgi: Remove 64K limit on encoded length of all envvars. An individual envvar with an encoded length of more than 16K will be omitted. [Jeff Trawick] diff --git a/docs/log-message-tags/next-number b/docs/log-message-tags/next-number index 099d024c1a1..1232cc3bd2c 100644 --- a/docs/log-message-tags/next-number +++ b/docs/log-message-tags/next-number @@ -1 +1 @@ -2537 +2538 diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c index 7b12dfe2cbf..ab2e83dc835 100644 --- a/modules/proxy/mod_proxy_fcgi.c +++ b/modules/proxy/mod_proxy_fcgi.c @@ -160,6 +160,26 @@ static apr_status_t get_data(proxy_conn_rec *conn, return rv; } +static apr_status_t get_data_full(proxy_conn_rec *conn, + char *buffer, + apr_size_t buflen) +{ + apr_size_t readlen; + apr_size_t cumulative_len = 0; + apr_status_t rv; + + do { + readlen = buflen - cumulative_len; + rv = get_data(conn, buffer + cumulative_len, &readlen); + if (rv != APR_SUCCESS) { + return rv; + } + cumulative_len += readlen; + } while (cumulative_len < buflen); + + return APR_SUCCESS; +} + static apr_status_t send_begin_request(proxy_conn_rec *conn, apr_uint16_t request_id) { @@ -534,24 +554,15 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf, memset(farray, 0, sizeof(farray)); /* First, we grab the header... */ - readbuflen = AP_FCGI_HEADER_LEN; - - rv = get_data(conn, (char *) farray, &readbuflen); + rv = get_data_full(conn, (char *) farray, AP_FCGI_HEADER_LEN); if (rv != APR_SUCCESS) { - break; - } - - dump_header_to_log(r, farray, readbuflen); - - if (readbuflen != AP_FCGI_HEADER_LEN) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01067) - "Failed to read entire header " - "got %" APR_SIZE_T_FMT " wanted %d", - readbuflen, AP_FCGI_HEADER_LEN); - rv = APR_EINVAL; + "Failed to read FastCGI header"); break; } + dump_header_to_log(r, farray, AP_FCGI_HEADER_LEN); + ap_fcgi_header_fields_from_array(&version, &type, &rid, &clen, &plen, farray); @@ -713,10 +724,10 @@ recv_again: } if (plen) { - readbuflen = plen; - - rv = get_data(conn, readbuf, &readbuflen); + rv = get_data_full(conn, readbuf, plen); if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + APLOGNO(02537) "Error occurred reading padding"); break; } }