]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Borrow a fix from mod_authnz_fcgi:
authorJeff Trawick <trawick@apache.org>
Sat, 21 Sep 2013 18:48:20 +0000 (18:48 +0000)
committerJeff Trawick <trawick@apache.org>
Sat, 21 Sep 2013 18:48:20 +0000 (18:48 +0000)
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

CHANGES
docs/log-message-tags/next-number
modules/proxy/mod_proxy_fcgi.c

diff --git a/CHANGES b/CHANGES
index a0872d41ffc8554ff3408c020789e4135068b470..b91572e45cd29367a549f51287e9135fef296c3d 100644 (file)
--- 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]
index 099d024c1a15a4d51d5149d4155fe9a9e5a36117..1232cc3bd2c42ee45830dfcf597765e749590072 100644 (file)
@@ -1 +1 @@
-2537
+2538
index 7b12dfe2cbf027c182751a7626b15a3407c9962f..ab2e83dc835e3d250aa97589f75206e9df6fc1bb 100644 (file)
@@ -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;
                 }
             }