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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org