Author: kkolinko
Date: Wed Jan  9 11:41:18 2013
New Revision: 1430799

URL: http://svn.apache.org/viewvc?rev=1430799&view=rev
Log:
Avoid ArrayIndexOutOfBoundsException in HttpParser on incorrect input.
Inspired by o.a.t.util.buf.HexUtils.getDec()

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
    
tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestAuthorizationDigest.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java?rev=1430799&r1=1430798&r2=1430799&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java Wed 
Jan  9 11:41:18 2013
@@ -52,6 +52,7 @@ public class HttpParser {
 
     private static final Map<String,Integer> fieldTypes = new HashMap<>();
 
+    // Arrays used by isToken(), isHex() 
     private static final boolean isToken[] = new boolean[128];
     private static final boolean isHex[] = new boolean[128];
 
@@ -238,6 +239,24 @@ public class HttpParser {
         return result.toString();
     }
 
+    private static boolean isToken(int c) {
+        // Fast for correct values, slower for incorrect ones
+        try {
+            return isToken[c];
+        } catch (ArrayIndexOutOfBoundsException ex) {
+            return false;
+        }
+    }
+
+    private static boolean isHex(int c) {
+        // Fast for correct values, slower for incorrect ones
+        try {
+            return isHex[c];
+        } catch (ArrayIndexOutOfBoundsException ex) {
+            return false;
+        }
+    }
+
     private static SkipConstantResult skipConstant(StringReader input,
             String constant) throws IOException {
         int len = constant.length();
@@ -277,7 +296,7 @@ public class HttpParser {
             c = input.read();
         }
 
-        while (c != -1 && isToken[c]) {
+        while (c != -1 && isToken(c)) {
             result.append((char) c);
             c = input.read();
         }
@@ -381,7 +400,7 @@ public class HttpParser {
         }
         c = input.read();
 
-        while (c != -1 && isToken[c]) {
+        while (c != -1 && isToken(c)) {
             result.append((char) c);
             c = input.read();
         }
@@ -419,7 +438,7 @@ public class HttpParser {
             c = input.read();
         }
 
-        while (c != -1 && isHex[c]) {
+        while (c != -1 && isHex(c)) {
             result.append((char) c);
             c = input.read();
         }

Modified: 
tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestAuthorizationDigest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestAuthorizationDigest.java?rev=1430799&r1=1430798&r2=1430799&view=diff
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestAuthorizationDigest.java
 (original)
+++ 
tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestAuthorizationDigest.java
 Wed Jan  9 11:41:18 2013
@@ -196,6 +196,16 @@ public class TestAuthorizationDigest {
     }
 
     @Test
+    public void testQuotedNonTokenQop2() throws Exception {
+        String header = "Digest qop=\"{auth\"";
+
+        StringReader input = new StringReader(header);
+
+        Map<String,String> result = HttpParser.parseAuthorizationDigest(input);
+        Assert.assertNull(result);
+    }
+
+    @Test
     public void testUnclosedQuotedTokenQop() throws Exception {
         String header = "Digest qop=\"auth";
 
@@ -204,4 +214,34 @@ public class TestAuthorizationDigest {
         Map<String,String> result = HttpParser.parseAuthorizationDigest(input);
         Assert.assertNull(result);
     }
+
+    @Test
+    public void testWrongCharacterInToken() throws Exception {
+        String header = "Digest \u044f";
+
+        StringReader input = new StringReader(header);
+
+        Map<String,String> result = HttpParser.parseAuthorizationDigest(input);
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testWrongCharacterInQuotedToken() throws Exception {
+        String header = "Digest qop=\"\u044f\"";
+
+        StringReader input = new StringReader(header);
+
+        Map<String,String> result = HttpParser.parseAuthorizationDigest(input);
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testWrongCharacterInHex() throws Exception {
+        String header = "Digest nc=\u044f";
+
+        StringReader input = new StringReader(header);
+
+        Map<String,String> result = HttpParser.parseAuthorizationDigest(input);
+        Assert.assertNull(result);
+    }
 }



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

Reply via email to