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