You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2011/11/15 20:11:32 UTC

svn commit: r1202383 - /tomcat/jk/trunk/native/iis/jk_isapi_plugin.c

Author: mturk
Date: Tue Nov 15 19:11:32 2011
New Revision: 1202383

URL: http://svn.apache.org/viewvc?rev=1202383&view=rev
Log:
Use better header duplicate funtion that won't reuse one huge buffer and fix some coding style on the way

Modified:
    tomcat/jk/trunk/native/iis/jk_isapi_plugin.c

Modified: tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/jk_isapi_plugin.c?rev=1202383&r1=1202382&r2=1202383&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Tue Nov 15 19:11:32 2011
@@ -82,8 +82,9 @@
 #define TOMCAT_TRANSLATE_HEADER_NAME_BASE ("TOMCATTRANSLATE")
 #ifndef USE_CGI_HEADERS
 #define CONTENT_LENGTH                    ("CONTENT-LENGTH:")
+#define ALL_HEADERS                       ("ALL_RAW")
 #else
-#define CONTENT_LENGTH                    ("CONTENT_LENGTH:")
+#define ALL_HEADERS                       ("ALL_HTTP")
 #endif
 
 /* The HTTP_ form of the header for use in ExtensionProc */
@@ -445,26 +446,21 @@ static struct error_reasons {
 
 #define ISIZEOF(X)      (int)sizeof(X)
 
-#define GET_SERVER_VARIABLE_VALUE(name, place)          \
-  do {                                                  \
-    (place) = NULL;                                     \
-    huge_buf_sz = MAX_PACKET_SIZE;                      \
-    if (get_server_value(private_data->lpEcb,           \
-                        (name),                         \
-                        huge_buf,                       \
-                        huge_buf_sz)) {                 \
-        (place) = jk_pool_strdup(&private_data->p,      \
-                                 huge_buf);             \
-  } } while(0)
+#define GET_SERVER_VARIABLE_VALUE(name, place)              \
+  do {                                                      \
+    (place) = dup_server_value(private_data->lpEcb,         \
+                               (name),                      \
+                               &private_data->p);           \
+  } while(0)
 
 #define GET_SERVER_VARIABLE_VALUE_INT(name, place, def)     \
   do {                                                      \
-    huge_buf_sz = MAX_PACKET_SIZE;                          \
+    char _tb[RES_BUFFER_SIZE];                              \
     if (get_server_value(private_data->lpEcb,               \
                         (name),                             \
-                        huge_buf,                           \
-                        huge_buf_sz)) {                     \
-        (place) = atoi(huge_buf);                           \
+                        _tb,                                \
+                        RES_BUFFER_SIZE)) {                 \
+        (place) = atoi(_tb);                                \
         if (((place) == 0) && (errno == EINVAL ||           \
                                errno == ERANGE)) {          \
             (place) = def;                                  \
@@ -595,6 +591,9 @@ static BOOL get_server_value(LPEXTENSION
                              char *name,
                              char *buf, size_t bufsz);
 
+static char *dup_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,
+                              const char *name, jk_pool_t *p);
+
 static int base64_encode_cert_len(int len);
 
 static int base64_encode_cert(char *encoded,
@@ -3114,17 +3113,11 @@ static int get_registry_config_number(HK
 static int init_ws_service(isapi_private_data_t * private_data,
                            jk_ws_service_t *s, char **worker_name)
 {
-    char *huge_buf = NULL;   /* should be enough for all */
+    char *all_headers;
     int worker_index = -1;
     rule_extension_t *e;
     char  temp_buf[64];
-    DWORD huge_buf_sz;
     BOOL  unknown_content_length = FALSE;
-#ifndef USE_CGI_HEADERS
-    char *all_hdrs = "ALL_RAW";
-#else
-    char *all_hdrs = "ALL_HTTP";
-#endif
     unsigned int cnt = 0;
     char *tmp;
 
@@ -3136,11 +3129,6 @@ static int init_ws_service(isapi_private
     s->write = iis_write;
     s->done  = iis_done;
 
-    if (!(huge_buf = jk_pool_alloc(&private_data->p, MAX_PACKET_SIZE))) {
-        JK_TRACE_EXIT(logger);
-        return JK_FALSE;
-    }
-    huge_buf_sz = MAX_PACKET_SIZE;
     GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name));
     GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri);
     GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string);
@@ -3272,14 +3260,16 @@ static int init_ws_service(isapi_private
         /* XXX: To make the isapi plugin more consistent with the other web servers */
         /* we should also set s->ssl_cipher, s->ssl_session, and s->ssl_key_size. */
         if (num_of_vars) {
-            unsigned int j;
+            unsigned int j = 0;
 
-            s->attributes_names =
-                jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));
-            s->attributes_values =
-                jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));
-
-            j = 0;
+            s->attributes_names  = jk_pool_alloc(&private_data->p,
+                                                 num_of_vars * sizeof(char *));
+            s->attributes_values = jk_pool_alloc(&private_data->p,
+                                                 num_of_vars * sizeof(char *));
+            if (!s->attributes_names || !s->attributes_values) {
+                JK_TRACE_EXIT(logger);
+                return JK_FALSE;
+            }
             for (i = 0; i < 9; i++) {
                 if (ssl_env_values[i]) {
                     s->attributes_names[j] = ssl_env_names[i];
@@ -3290,12 +3280,17 @@ static int init_ws_service(isapi_private
             s->num_attributes = num_of_vars;
             if (ssl_env_values[4] && ssl_env_values[4][0] == '1') {
                 CERT_CONTEXT_EX cc;
+                BYTE *cb = jk_pool_alloc(&private_data->p, MAX_PACKET_SIZE);
+
+                if (!cb) {
+                    JK_TRACE_EXIT(logger);
+                    return JK_FALSE;                    
+                }
                 cc.cbAllocated = MAX_PACKET_SIZE;
-                cc.CertContext.pbCertEncoded = (BYTE *) huge_buf;
+                cc.CertContext.pbCertEncoded = cb;
                 cc.CertContext.cbCertEncoded = 0;
 
-                if (private_data->lpEcb->
-                    ServerSupportFunction(private_data->lpEcb->ConnID,
+                if (private_data->lpEcb->ServerSupportFunction(private_data->lpEcb->ConnID,
                                           HSE_REQ_GET_CERT_INFO_EX,
                                           &cc, NULL, NULL) != FALSE) {
                     jk_log(logger, JK_LOG_DEBUG,
@@ -3305,49 +3300,27 @@ static int init_ws_service(isapi_private
                            cc.CertContext.cbCertEncoded,
                            cc.dwCertificateFlags);
                     s->ssl_cert = jk_pool_alloc(&private_data->p,
-                                      base64_encode_cert_len(cc.CertContext.
-                                                             cbCertEncoded));
-                    s->ssl_cert_len = base64_encode_cert(s->ssl_cert,
-                                                         huge_buf,
-                                                         cc.CertContext.
-                                                         cbCertEncoded) - 1;
+                                      base64_encode_cert_len(cc.CertContext.cbCertEncoded));
+                    s->ssl_cert_len = base64_encode_cert(s->ssl_cert, cb,
+                                                         cc.CertContext.cbCertEncoded) - 1;
                 }
             }
         }
     }
 
-    huge_buf_sz = MAX_PACKET_SIZE;
-    if (!private_data->lpEcb->GetServerVariable(private_data->lpEcb,
-                                                all_hdrs,
-                                                huge_buf,
-                                                &huge_buf_sz)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-            JK_TRACE_EXIT(logger);
-            return JK_FALSE;
-        }
-        /* User has more then 64K of headers.
-         * Resize initial buffer
-         */
-        if (!(huge_buf = jk_pool_alloc(&private_data->p, MAX_PACKET_SIZE))) {
-            JK_TRACE_EXIT(logger);
-            return JK_FALSE;
-        }
-        if (!private_data->lpEcb->GetServerVariable(private_data->lpEcb,
-                                                    all_hdrs,
-                                                    huge_buf,
-                                                    &huge_buf_sz)) {
-            JK_TRACE_EXIT(logger);
-            return JK_FALSE;
-        }
+    GET_SERVER_VARIABLE_VALUE(ALL_HEADERS, all_headers);
+    if (!all_headers) {
+        JK_TRACE_EXIT(logger);
+        return JK_FALSE;
     }
-    for (tmp = huge_buf; *tmp; tmp++) {
+    for (tmp = all_headers; *tmp; tmp++) {
         if (*tmp == '\n') {
             cnt++;
         }
     }
 
     if (cnt) {
-        char *headers_buf = huge_buf;
+        char *headers_buf = all_headers;
         unsigned int i;
         BOOL need_content_length_header = FALSE;
 
@@ -3358,12 +3331,11 @@ static int init_ws_service(isapi_private
         }
 
         /* allocate an extra header slot in case we need to add a content-length header */
-        s->headers_names =
-            jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
-        s->headers_values =
-            jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
-
-        if (!s->headers_names || !s->headers_values || !headers_buf) {
+        s->headers_names  = jk_pool_alloc(&private_data->p,
+                                         (cnt + 1) * sizeof(char *));
+        s->headers_values = jk_pool_alloc(&private_data->p,
+                                         (cnt + 1) * sizeof(char *));
+        if (!s->headers_names || !s->headers_values) {
             JK_TRACE_EXIT(logger);
             return JK_FALSE;
         }
@@ -3429,8 +3401,7 @@ static int init_ws_service(isapi_private
 #endif
                 tmp++;
             }
-            *tmp = '\0';
-            tmp++;
+            *tmp++ = '\0';
 
             /* Skip all the WS chars after the ':' to the beginning of the header value */
             while (' ' == *tmp || '\t' == *tmp || '\v' == *tmp) {
@@ -3444,9 +3415,7 @@ static int init_ws_service(isapi_private
             while (*tmp && *tmp != '\n' && *tmp != '\r') {
                 tmp++;
             }
-            *tmp = '\0';
-            tmp++;
-
+            *tmp++ = '\0';
             /* skip CR LF */
             while (*tmp == '\n' || *tmp == '\r') {
                 tmp++;
@@ -3519,6 +3488,24 @@ static BOOL get_server_value(LPEXTENSION
                                     buf, &sz);
 }
 
+static char *dup_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,
+                              const char *name, jk_pool_t *p)
+{
+    DWORD sz = HDR_BUFFER_SIZE;    
+    char buf[HDR_BUFFER_SIZE];
+    char *dp;
+
+    if (lpEcb->GetServerVariable(lpEcb->ConnID, (LPSTR)name, buf, &sz))
+        return jk_pool_strdup(p, buf);    
+    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+        return NULL;    
+    if ((dp = jk_pool_alloc(p, sz))) {
+        if (lpEcb->GetServerVariable(lpEcb->ConnID, (LPSTR)name, dp, &sz))
+            return dp;
+    }
+    return NULL;    
+}
+
 static const char begin_cert[] = "-----BEGIN CERTIFICATE-----\r\n";
 
 static const char end_cert[] = "-----END CERTIFICATE-----\r\n";



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org