Author: markt
Date: Mon Mar  4 11:24:49 2013
New Revision: 1452256

URL: http://svn.apache.org/r1452256
Log:
Add test from unicode 6.2, chapter 3, table 3-8
Tomcat's decoder needs to check bytes in the range 80..BF start 10xx xxxx 
rather than 1xxx xxxx

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/buf/Utf8Decoder.java
    tomcat/trunk/test/org/apache/tomcat/util/buf/TestUtf8Extended.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/Utf8Decoder.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/Utf8Decoder.java?rev=1452256&r1=1452255&r2=1452256&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/Utf8Decoder.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/Utf8Decoder.java Mon Mar  4 
11:24:49 2013
@@ -174,7 +174,7 @@ public class Utf8Decoder extends Charset
                 if (tailAvailable > 0) {
                     // First byte C2..DF, second byte 80..BF
                     if (jchar > 0x41 && jchar < 0x60 &&
-                            (bArr[inIndex + 1] & 0x80) != 0x80) {
+                            (bArr[inIndex + 1] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
@@ -187,7 +187,7 @@ public class Utf8Decoder extends Charset
                     }
                     // First byte E1..EC, second byte 80..BF
                     if (jchar > 0x60 && jchar < 0x6D &&
-                            (bArr[inIndex + 1] & 0x80) != 0x80) {
+                            (bArr[inIndex + 1] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
@@ -200,7 +200,7 @@ public class Utf8Decoder extends Charset
                     }
                     // First byte EE..EF, second byte 80..BF
                     if (jchar > 0x6D && jchar < 0x70 &&
-                            (bArr[inIndex + 1] & 0x80) != 0x80) {
+                            (bArr[inIndex + 1] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
@@ -215,7 +215,7 @@ public class Utf8Decoder extends Charset
                     }
                     // First byte F1..F3, second byte 80..BF
                     if (jchar > 0x70 && jchar < 0x74 &&
-                            (bArr[inIndex + 1] & 0x80) != 0x80) {
+                            (bArr[inIndex + 1] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
@@ -230,7 +230,7 @@ public class Utf8Decoder extends Charset
                 }
                 // Check third byte if present and expected
                 if (tailAvailable > 1 && tail > 1) {
-                    if ((bArr[inIndex + 2] & 0x80) != 0x80) {
+                    if ((bArr[inIndex + 2] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(2);
@@ -238,7 +238,7 @@ public class Utf8Decoder extends Charset
                 }
                 // Check fourth byte if present and expected
                 if (tailAvailable > 2 && tail > 2) {
-                    if ((bArr[inIndex + 3] & 0x80) != 0x80) {
+                    if ((bArr[inIndex + 3] & 0xC0) != 0x80) {
                         in.position(inIndex - in.arrayOffset());
                         out.position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(3);

Modified: tomcat/trunk/test/org/apache/tomcat/util/buf/TestUtf8Extended.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/buf/TestUtf8Extended.java?rev=1452256&r1=1452255&r2=1452256&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/buf/TestUtf8Extended.java 
(original)
+++ tomcat/trunk/test/org/apache/tomcat/util/buf/TestUtf8Extended.java Mon Mar  
4 11:24:49 2013
@@ -53,6 +53,7 @@ public class TestUtf8Extended {
 
     @Before
     public void setup() {
+        /*
         testCases.add(new Utf8TestCase(
                 "Zero length input",
                 new int[] {},
@@ -127,6 +128,13 @@ public class TestUtf8Extended {
                 new int[] {0x41, 0x80, 0x41},
                 1,
                 "A\uFFFDA"));
+        */
+        testCases.add(new Utf8TestCase(
+                "Invalid sequence from unicode 6.2 spec, table 3-8",
+                new int[] {0x61, 0xF1, 0x80, 0x80, 0xE1, 0x80, 0xC2, 0x62, 
0x80,
+                        0x63, 0x80, 0xBF, 0x64},
+                4,
+                "a\uFFFD\uFFFD\uFFFDb\uFFFDc\uFFFD\uFFFDd"));
     }
 
     @Test



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

Reply via email to