You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2011/06/29 01:26:12 UTC
svn commit: r1140904 - in /tomcat/tc6.0.x/trunk: STATUS.txt
java/org/apache/catalina/connector/Request.java
java/org/apache/tomcat/util/buf/B2CConverter.java
java/org/apache/tomcat/util/buf/ByteChunk.java webapps/docs/changelog.xml
Author: markt
Date: Tue Jun 28 23:26:11 2011
New Revision: 1140904
URL: http://svn.apache.org/viewvc?rev=1140904&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51400
Avoid jvm bottleneck on String/byte[] conversion triggered by a JVM bug.
Based on patches by Dave Engberg and Konstantin Preißer.
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1140904&r1=1140903&r2=1140904&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Jun 28 23:26:11 2011
@@ -140,13 +140,6 @@ PATCHES PROPOSED TO BACKPORT:
+1: kkolinko, schultz
-1:
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51400
- Avoid jvm bottleneck on String/byte[] conversion currently affecting a user
- https://issues.apache.org/bugzilla/attachment.cgi?id=27219
- Based on patches by Dave Engberg and Konstantin Preißer
- +1: markt, kkolinko, schultz
- -1:
-
* Fix truncated cookies.
Based on https://issues.jboss.org/browse/JBWEB-196
http://people.apache.org/~jfclere/patches/patch.110622.txt
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1140904&r1=1140903&r2=1140904&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java Tue Jun 28 23:26:11 2011
@@ -1516,15 +1516,12 @@ public class Request
if (usingReader)
return;
-
- // Ensure that the specified encoding is valid
- byte buffer[] = new byte[1];
- buffer[0] = (byte) 'a';
- String dummy = new String(buffer, enc);
+
+ // Confirm that the encoding name is valid
+ B2CConverter.getCharset(enc);
// Save the validated encoding
coyoteRequest.setCharacterEncoding(enc);
-
}
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java?rev=1140904&r1=1140903&r2=1140904&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java Tue Jun 28 23:26:11 2011
@@ -22,6 +22,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
/** Efficient conversion of bytes to character .
*
@@ -39,7 +43,36 @@ public class B2CConverter {
private static org.apache.juli.logging.Log log=
org.apache.juli.logging.LogFactory.getLog( B2CConverter.class );
+
+ private static final Map<String, Charset> encodingToCharsetCache =
+ new HashMap<String, Charset>();
+ static {
+ for (Charset charset: Charset.availableCharsets().values()) {
+ encodingToCharsetCache.put(
+ charset.name().toLowerCase(Locale.US), charset);
+ for (String alias : charset.aliases()) {
+ encodingToCharsetCache.put(
+ alias.toLowerCase(Locale.US), charset);
+ }
+ }
+ }
+
+ public static Charset getCharset(String enc)
+ throws UnsupportedEncodingException {
+
+ // Encoding names should all be ASCII
+ String lowerCaseEnc = enc.toLowerCase(Locale.US);
+
+ Charset charset = encodingToCharsetCache.get(lowerCaseEnc);
+
+ if (charset == null) {
+ // Pre-population of the cache means this must be invalid
+ throw new UnsupportedEncodingException(enc);
+ }
+ return charset;
+ }
+
private IntermediateInputStream iis;
private ReadConvertor conv;
private String encoding;
@@ -114,7 +147,7 @@ public class B2CConverter {
{
// destroy the reader/iis
iis=new IntermediateInputStream();
- conv=new ReadConvertor( iis, encoding );
+ conv=new ReadConvertor( iis, getCharset(encoding) );
}
private final int debug=0;
@@ -192,10 +225,9 @@ final class ReadConvertor extends Input
/** Create a converter.
*/
- public ReadConvertor( IntermediateInputStream in, String enc )
- throws UnsupportedEncodingException
+ public ReadConvertor( IntermediateInputStream in, Charset charset )
{
- super( in, enc );
+ super( in, charset );
}
/** Overriden - will do nothing but reset internal state.
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java?rev=1140904&r1=1140903&r2=1140904&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Tue Jun 28 23:26:11 2011
@@ -19,6 +19,8 @@ package org.apache.tomcat.util.buf;
import java.io.IOException;
import java.io.Serializable;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
/*
* In a server it is very important to be able to operate on
@@ -95,7 +97,12 @@ public final class ByteChunk implements
8859_1, and this object is used mostly for servlets.
*/
public static final String DEFAULT_CHARACTER_ENCODING="ISO-8859-1";
-
+
+ /** Default Charset to use for interpreting byte[] as as String
+ */
+ public static final Charset DEFAULT_CHARSET =
+ Charset.forName(DEFAULT_CHARACTER_ENCODING);
+
// byte[]
private byte[] buff;
@@ -493,8 +500,14 @@ public final class ByteChunk implements
public String toStringInternal() {
String strValue=null;
try {
- if( enc==null ) enc=DEFAULT_CHARACTER_ENCODING;
- strValue = new String( buff, start, end-start, enc );
+ Charset charset;
+ if (enc == null) {
+ charset = DEFAULT_CHARSET;
+ } else {
+ charset = B2CConverter.getCharset(enc);
+ }
+ strValue = charset.decode(
+ ByteBuffer.wrap(buff, start, end-start)).toString();
/*
Does not improve the speed too much on most systems,
it's safer to use the "clasical" new String().
Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1140904&r1=1140903&r2=1140904&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Jun 28 23:26:11 2011
@@ -135,6 +135,11 @@
runtime exception (e.g. OOME) occurs while creating a new user for a
MemoryUserDatabase via JMX. (markt)
</fix>
+ <fix>
+ <bug>51400</bug>: Avoid jvm bottleneck on String/byte[] conversion
+ triggered by a JVM bug. Based on patches by Dave Engberg and Konstantin
+ Preißer. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org