httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j..@apache.org
Subject svn commit: r389847 - in /httpd/httpd/branches/fcgi-proxy-dev/modules/proxy: fcgi_protocol.h mod_proxy_fcgi.c
Date Wed, 29 Mar 2006 17:59:15 GMT
Author: jim
Date: Wed Mar 29 09:59:14 2006
New Revision: 389847

URL: http://svn.apache.org/viewcvs?rev=389847&view=rev
Log:
Limit environment size to FastCGI to FCGI_MAX_ENV_SIZE
(which is currently 65535)

Modified:
    httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/fcgi_protocol.h
    httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c

Modified: httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/fcgi_protocol.h
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/fcgi_protocol.h?rev=389847&r1=389846&r2=389847&view=diff
==============================================================================
--- httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/fcgi_protocol.h (original)
+++ httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/fcgi_protocol.h Wed Mar 29 09:59:14
2006
@@ -95,6 +95,13 @@
     unsigned char reserved[5];
 } fcgi_begin_request_body;
 
+/*
+ * Maximum size of the allowed environment.
+ */
+#define FCGI_MAX_ENV_SIZE  65535
+
+/* #define FCGI_DUMP_ENV_VARS */
+
 
 #endif /* FCGI_PROTOCOL_H */
 /** @} */

Modified: httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c?rev=389847&r1=389846&r2=389847&view=diff
==============================================================================
--- httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c (original)
+++ httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c Wed Mar 29 09:59:14
2006
@@ -211,19 +211,18 @@
     struct iovec vec[2];
     fcgi_header header;
     unsigned char farray[FCGI_HEADER_LEN];
-    apr_size_t bodylen;
+    apr_size_t bodylen, envlen;
     char *body, *itr;
     apr_status_t rv;
     apr_size_t len;
-    int i;
+    int i, numenv;
 
     ap_add_common_vars(r);
     ap_add_cgi_vars(r);
 
     /* XXX are there any FastCGI specific env vars we need to send? */
 
-    /* XXX What if there is over 64k worth of data in the env? */
-    bodylen = 0;
+    bodylen = envlen = 0;
 
     /* XXX mod_cgi/mod_cgid use ap_create_environment here, which fills in
      *     the TZ value specially.  We could use that, but it would mean
@@ -245,13 +244,13 @@
         keylen = strlen(elts[i].key);
 
         if (keylen >> 7 == 0) {
-            bodylen += 1;
+            envlen += 1;
         }
         else {
-            bodylen += 4;
+            envlen += 4;
         }
 
-        bodylen += keylen;
+        envlen += keylen;
 
         vallen = strlen(elts[i].val);
 
@@ -262,20 +261,31 @@
 #endif
 
         if (vallen >> 7 == 0) {
-            bodylen += 1;
+            envlen += 1;
         }
         else {
-            bodylen += 4;
+            envlen += 4;
         }
 
-        bodylen += vallen;
+        envlen += vallen;
+
+        if (envlen > FCGI_MAX_ENV_SIZE) {
+            ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
+                          "proxy: FCGI: truncating environment to %d bytes and %d elements",
+                          (int)bodylen, i);
+            break;
+        }
+
+        bodylen = envlen;
     }
 
+    numenv = i;
+
     body = apr_pcalloc(r->pool, bodylen);
 
     itr = body;
 
-    for (i = 0; i < envarr->nelts; ++i) {
+    for (i = 0; i < numenv; ++i) {
         apr_size_t keylen, vallen;
        
         if (! elts[i].key) {



Mime
View raw message