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:54:15 UTC

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

Author: mturk
Date: Tue Nov 15 19:54:15 2011
New Revision: 1202398

URL: http://svn.apache.org/viewvc?rev=1202398&view=rev
Log:
Bail out early on invalid params. No functional change

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=1202398&r1=1202397&r2=1202398&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:54:15 2011
@@ -1297,190 +1297,181 @@ static int isapi_write_client(isapi_priv
  */
 static int JK_METHOD iis_write(jk_ws_service_t *s, const void *b, unsigned int l)
 {
-    JK_TRACE_ENTER(logger);
+    isapi_private_data_t *p;
+    const char *buf = (const char *)b;
 
+    JK_TRACE_ENTER(logger);
     if (!l) {
         JK_TRACE_EXIT(logger);
         return JK_TRUE;
     }
+    if (s == NULL || s->ws_private == NULL || b == NULL) {
+        JK_LOG_NULL_PARAMS(logger);
+        JK_TRACE_EXIT(logger);
+        return JK_FALSE;
+    }
+    p = s->ws_private;
 
-    if (s && s->ws_private && b) {
-        isapi_private_data_t *p = s->ws_private;
-        const char *buf = (const char *)b;
+    if (!s->response_started) {
+        start_response(s, 200, NULL, NULL, NULL, 0);
+    }
 
-        if (!p) {
+    if (p->chunk_content == JK_FALSE) {
+        if (isapi_write_client(p, buf, l) == JK_FALSE) {
             JK_TRACE_EXIT(logger);
             return JK_FALSE;
         }
-
-        if (!s->response_started) {
-            start_response(s, 200, NULL, NULL, NULL, 0);
-        }
-
-        if (p->chunk_content == JK_FALSE) {
-            if (isapi_write_client(p, buf, l) == JK_FALSE) {
-                JK_TRACE_EXIT(logger);
-                return JK_FALSE;
-            }
-        }
-        else {
-            char chunk_header[RES_BUFFER_SIZE];
-
-            /* Construct chunk header : HEX CRLF*/
-            StringCbPrintf(chunk_header, RES_BUFFER_SIZE, "%X%s", l, CRLF);
-
-            if (iis_info.major >= 6) {
-                HSE_RESPONSE_VECTOR response_vector;
-                HSE_VECTOR_ELEMENT response_elements[3];
-
-                response_elements[0].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
-                response_elements[0].pvContext = chunk_header;
-                response_elements[0].cbOffset = 0;
-                response_elements[0].cbSize = strlen(chunk_header);
-
-                response_elements[1].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
-                response_elements[1].pvContext = (PVOID)buf;
-                response_elements[1].cbOffset = 0;
-                response_elements[1].cbSize = l;
-
-                response_elements[2].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
-                response_elements[2].pvContext = CRLF;
-                response_elements[2].cbOffset = 0;
-                response_elements[2].cbSize = CRLF_LEN;
-
-                response_vector.dwFlags = HSE_IO_SYNC;
-                response_vector.pszStatus = NULL;
-                response_vector.pszHeaders = NULL;
-                response_vector.nElementCount = 3;
-                response_vector.lpElementArray = response_elements;
-
-                if (JK_IS_DEBUG_LEVEL(logger))
-                    jk_log(logger, JK_LOG_DEBUG,
-                           "Using vector write for chunk encoded %d byte chunk", l);
-
-                if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
-                    HSE_REQ_VECTOR_SEND,
-                    &response_vector,
-                    NULL, NULL)) {
-                        jk_log(logger, JK_LOG_ERROR,
-                               "Vector write of chunk encoded response failed with %d (0x%08x)",
-                               GetLastError(), GetLastError());
-                        JK_TRACE_EXIT(logger);
-                        return JK_FALSE;
-                }
-            }
-            else {
-                /* Write chunk header */
-                if (JK_IS_DEBUG_LEVEL(logger))
-                    jk_log(logger, JK_LOG_DEBUG,
-                    "Using chunked encoding - writing chunk header for %d byte chunk", l);
-
-                if (!isapi_write_client(p, chunk_header, (unsigned int)strlen(chunk_header))) {
-                    jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk header failed");
-                    JK_TRACE_EXIT(logger);
-                    return JK_FALSE;
-                }
-
-                /* Write chunk body (or simple body block) */
-                if (JK_IS_DEBUG_LEVEL(logger)) {
-                    jk_log(logger, JK_LOG_DEBUG, "Writing %s of size %d",
-                           (p->chunk_content ? "chunk body" : "simple response"), l);
-                }
-                if (!isapi_write_client(p, buf, l)) {
-                    jk_log(logger, JK_LOG_ERROR, "WriteClient for response body chunk failed");
-                    JK_TRACE_EXIT(logger);
-                    return JK_FALSE;
-                }
-                /* Write chunk trailer */
-                if (JK_IS_DEBUG_LEVEL(logger)) {
-                    jk_log(logger, JK_LOG_DEBUG, "Using chunked encoding - writing chunk trailer");
-                }
-
-                if (!isapi_write_client(p, CRLF, CRLF_LEN)) {
-                    jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk trailer failed");
-                    JK_TRACE_EXIT(logger);
-                    return JK_FALSE;
-                }
-            }
-        }
-
-        JK_TRACE_EXIT(logger);
-        return JK_TRUE;
-
     }
+    else {
+        char chunk_header[RES_BUFFER_SIZE];
 
-    JK_LOG_NULL_PARAMS(logger);
-    JK_TRACE_EXIT(logger);
-    return JK_FALSE;
-}
-
-/**
- * In the case of a Transfer-Encoding: chunked response, this will write the terminator chunk.
- */
-static int JK_METHOD iis_done(jk_ws_service_t *s)
-{
-    JK_TRACE_ENTER(logger);
-
-    if (s && s->ws_private) {
-        isapi_private_data_t *p = s->ws_private;
-
-        if (p->chunk_content == JK_FALSE) {
-            JK_TRACE_EXIT(logger);
-            return JK_TRUE;
-        }
+        /* Construct chunk header : HEX CRLF*/
+        StringCbPrintf(chunk_header, RES_BUFFER_SIZE, "%X%s", l, CRLF);
 
-        /* Write last chunk + terminator */
         if (iis_info.major >= 6) {
             HSE_RESPONSE_VECTOR response_vector;
-            HSE_VECTOR_ELEMENT response_elements[1];
+            HSE_VECTOR_ELEMENT response_elements[3];
 
             response_elements[0].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
-            response_elements[0].pvContext = CHUNKED_ENCODING_TRAILER;
+            response_elements[0].pvContext = chunk_header;
             response_elements[0].cbOffset = 0;
-            response_elements[0].cbSize = CHUNKED_ENCODING_TRAILER_LEN;
+            response_elements[0].cbSize = strlen(chunk_header);
+
+            response_elements[1].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+            response_elements[1].pvContext = (PVOID)buf;
+            response_elements[1].cbOffset = 0;
+            response_elements[1].cbSize = l;
+
+            response_elements[2].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+            response_elements[2].pvContext = CRLF;
+            response_elements[2].cbOffset = 0;
+            response_elements[2].cbSize = CRLF_LEN;
 
-            /* HSE_IO_FINAL_SEND lets IIS process the response to the client before we return */
-            response_vector.dwFlags = HSE_IO_SYNC | HSE_IO_FINAL_SEND;
+            response_vector.dwFlags = HSE_IO_SYNC;
             response_vector.pszStatus = NULL;
             response_vector.pszHeaders = NULL;
-            response_vector.nElementCount = 1;
+            response_vector.nElementCount = 3;
             response_vector.lpElementArray = response_elements;
 
             if (JK_IS_DEBUG_LEVEL(logger))
                 jk_log(logger, JK_LOG_DEBUG,
-                       "Using vector write to terminate chunk encoded response.");
+                       "Using vector write for chunk encoded %d byte chunk", l);
 
             if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
-                                                 HSE_REQ_VECTOR_SEND,
-                                                 &response_vector,
-                                                 NULL, NULL)) {
+                HSE_REQ_VECTOR_SEND,
+                &response_vector,
+                NULL, NULL)) {
                     jk_log(logger, JK_LOG_ERROR,
-                           "Vector termination of chunk encoded response failed with %d (0x%08x)",
+                           "Vector write of chunk encoded response failed with %d (0x%08x)",
                            GetLastError(), GetLastError());
                     JK_TRACE_EXIT(logger);
                     return JK_FALSE;
             }
         }
         else {
+            /* Write chunk header */
             if (JK_IS_DEBUG_LEVEL(logger))
-                jk_log(logger, JK_LOG_DEBUG, "Terminating chunk encoded response");
+                jk_log(logger, JK_LOG_DEBUG,
+                "Using chunked encoding - writing chunk header for %d byte chunk", l);
 
-            if (!isapi_write_client(p, CHUNKED_ENCODING_TRAILER, CHUNKED_ENCODING_TRAILER_LEN)) {
-                jk_log(logger, JK_LOG_ERROR,
-                       "WriteClient for chunked response terminator failed with %d (0x%08x)",
-                       GetLastError(), GetLastError());
+            if (!isapi_write_client(p, chunk_header, (unsigned int)strlen(chunk_header))) {
+                jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk header failed");
+                JK_TRACE_EXIT(logger);
+                return JK_FALSE;
+            }
+
+            /* Write chunk body (or simple body block) */
+            if (JK_IS_DEBUG_LEVEL(logger)) {
+                jk_log(logger, JK_LOG_DEBUG, "Writing %s of size %d",
+                       (p->chunk_content ? "chunk body" : "simple response"), l);
+            }
+            if (!isapi_write_client(p, buf, l)) {
+                jk_log(logger, JK_LOG_ERROR, "WriteClient for response body chunk failed");
+                JK_TRACE_EXIT(logger);
+                return JK_FALSE;
+            }
+            /* Write chunk trailer */
+            if (JK_IS_DEBUG_LEVEL(logger)) {
+                jk_log(logger, JK_LOG_DEBUG, "Using chunked encoding - writing chunk trailer");
+            }
+
+            if (!isapi_write_client(p, CRLF, CRLF_LEN)) {
+                jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk trailer failed");
                 JK_TRACE_EXIT(logger);
                 return JK_FALSE;
             }
         }
+    }
+    JK_TRACE_EXIT(logger);
+    return JK_TRUE;
+}
+
+/**
+ * In the case of a Transfer-Encoding: chunked response, this will write the terminator chunk.
+ */
+static int JK_METHOD iis_done(jk_ws_service_t *s)
+{
+    isapi_private_data_t *p;
 
+    JK_TRACE_ENTER(logger);
+    if (s == NULL || s->ws_private == NULL) {
+        JK_LOG_NULL_PARAMS(logger);
+        JK_TRACE_EXIT(logger);
+        return JK_FALSE;
+    }
+    p = s->ws_private;
+    if (p->chunk_content == JK_FALSE) {
         JK_TRACE_EXIT(logger);
         return JK_TRUE;
     }
 
-    JK_LOG_NULL_PARAMS(logger);
+    /* Write last chunk + terminator */
+    if (iis_info.major >= 6) {
+        HSE_RESPONSE_VECTOR response_vector;
+        HSE_VECTOR_ELEMENT response_elements[1];
+
+        response_elements[0].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+        response_elements[0].pvContext = CHUNKED_ENCODING_TRAILER;
+        response_elements[0].cbOffset = 0;
+        response_elements[0].cbSize = CHUNKED_ENCODING_TRAILER_LEN;
+
+        /* HSE_IO_FINAL_SEND lets IIS process the response to the client before we return */
+        response_vector.dwFlags = HSE_IO_SYNC | HSE_IO_FINAL_SEND;
+        response_vector.pszStatus = NULL;
+        response_vector.pszHeaders = NULL;
+        response_vector.nElementCount = 1;
+        response_vector.lpElementArray = response_elements;
+
+        if (JK_IS_DEBUG_LEVEL(logger))
+            jk_log(logger, JK_LOG_DEBUG,
+                   "Using vector write to terminate chunk encoded response.");
+
+        if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
+                                             HSE_REQ_VECTOR_SEND,
+                                             &response_vector,
+                                             NULL, NULL)) {
+                jk_log(logger, JK_LOG_ERROR,
+                       "Vector termination of chunk encoded response failed with %d (0x%08x)",
+                       GetLastError(), GetLastError());
+                JK_TRACE_EXIT(logger);
+                return JK_FALSE;
+        }
+    }
+    else {
+        if (JK_IS_DEBUG_LEVEL(logger))
+            jk_log(logger, JK_LOG_DEBUG, "Terminating chunk encoded response");
+
+        if (!isapi_write_client(p, CHUNKED_ENCODING_TRAILER, CHUNKED_ENCODING_TRAILER_LEN)) {
+            jk_log(logger, JK_LOG_ERROR,
+                   "WriteClient for chunked response terminator failed with %d (0x%08x)",
+                   GetLastError(), GetLastError());
+            JK_TRACE_EXIT(logger);
+            return JK_FALSE;
+        }
+    }
+
     JK_TRACE_EXIT(logger);
-    return JK_FALSE;
+    return JK_TRUE;
 }
 
 BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
@@ -3281,7 +3272,7 @@ static int init_ws_service(isapi_private
 
                 if (!cb) {
                     JK_TRACE_EXIT(logger);
-                    return JK_FALSE;                    
+                    return JK_FALSE;
                 }
                 cc.cbAllocated = MAX_PACKET_SIZE;
                 cc.CertContext.pbCertEncoded = cb;
@@ -3488,19 +3479,19 @@ static BOOL get_server_value(LPEXTENSION
 static char *dup_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,
                               const char *name, jk_pool_t *p)
 {
-    DWORD sz = HDR_BUFFER_SIZE;    
+    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);    
+        return jk_pool_strdup(p, buf);
     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-        return NULL;    
+        return NULL;
     if ((dp = jk_pool_alloc(p, sz))) {
         if (lpEcb->GetServerVariable(lpEcb->ConnID, (LPSTR)name, dp, &sz))
             return dp;
     }
-    return NULL;    
+    return NULL;
 }
 
 static const char begin_cert[] = "-----BEGIN CERTIFICATE-----\r\n";



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