Author: markt Date: Mon Jun 8 20:53:39 2015 New Revision: 1684277 URL: http://svn.apache.org/r1684277 Log: Invalid priority length is only a stream error
Modified: tomcat/trunk/java/org/apache/coyote/http2/FrameType.java tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java Modified: tomcat/trunk/java/org/apache/coyote/http2/FrameType.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/FrameType.java?rev=1684277&r1=1684276&r2=1684277&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/FrameType.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/FrameType.java Mon Jun 8 20:53:39 2015 @@ -22,17 +22,17 @@ import org.apache.tomcat.util.res.String public enum FrameType { - DATA (0, false, true, null), - HEADERS (1, false, true, null), - PRIORITY (2, false, true, (x) -> x == 5), - RST (3, false, true, (x) -> x == 4), - SETTINGS (4, true, false, (x) -> x % 6 == 0), - PUSH_PROMISE (5, false, true, (x) -> x >= 4), - PING (6, true, false, (x) -> x == 8), - GOAWAY (7, true, false, (x) -> x >= 8), - WINDOW_UPDATE (8, true, true, (x) -> x == 4), - CONTINUATION (9, false, true, null), - UNKNOWN (256, true, true, null); + DATA (0, false, true, null, false), + HEADERS (1, false, true, null, true), + PRIORITY (2, false, true, (x) -> x == 5, false), + RST (3, false, true, (x) -> x == 4, false), + SETTINGS (4, true, false, (x) -> x % 6 == 0, true), + PUSH_PROMISE (5, false, true, (x) -> x >= 4, true), + PING (6, true, false, (x) -> x == 8, false), + GOAWAY (7, true, false, (x) -> x >= 8, false), + WINDOW_UPDATE (8, true, true, (x) -> x == 4, false), + CONTINUATION (9, false, true, null, true), + UNKNOWN (256, true, true, null, false); private static final StringManager sm = StringManager.getManager(FrameType.class); @@ -40,14 +40,16 @@ public enum FrameType { private final boolean streamZero; private final boolean streamNonZero; private final IntPredicate payloadSizeValidator; + private final boolean payloadErrorFatal; private FrameType(int id, boolean streamZero, boolean streamNonZero, - IntPredicate payloadSizeValidator) { + IntPredicate payloadSizeValidator, boolean payloadErrorFatal) { this.id = id; this.streamZero = streamZero; this.streamNonZero = streamNonZero; this.payloadSizeValidator = payloadSizeValidator; + this.payloadErrorFatal = payloadErrorFatal; } @@ -64,11 +66,17 @@ public enum FrameType { } - public void checkPayloadSize(int payloadSize) throws Http2Exception { + public void checkPayloadSize(int streamId, int payloadSize) throws Http2Exception { if (payloadSizeValidator != null && !payloadSizeValidator.test(payloadSize)) { - throw new ConnectionError(sm.getString("frameType.checkPayloadSize", - Integer.toString(payloadSize), this), - Error.FRAME_SIZE_ERROR); + if (payloadErrorFatal) { + throw new ConnectionError(sm.getString("frameType.checkPayloadSize", + Integer.toString(payloadSize), this), + Error.FRAME_SIZE_ERROR); + } else { + throw new StreamError(sm.getString("frameType.checkPayloadSize", + Integer.toString(payloadSize), this), + Error.FRAME_SIZE_ERROR, streamId); + } } } Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java?rev=1684277&r1=1684276&r2=1684277&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Mon Jun 8 20:53:39 2015 @@ -435,7 +435,7 @@ class Http2Parser { } frameType.checkStream(streamId); - frameType.checkPayloadSize(payloadSize); + frameType.checkPayloadSize(streamId, payloadSize); } Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1684277&r1=1684276&r2=1684277&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Mon Jun 8 20:53:39 2015 @@ -172,7 +172,7 @@ public class Http2UpgradeHandler extends String base64Settings = stream.getCoyoteRequest().getHeader(HTTP2_SETTINGS_HEADER); byte[] settings = Base64.decodeBase64(base64Settings); - FrameType.SETTINGS.checkPayloadSize(settings.length); + FrameType.SETTINGS.checkPayloadSize(1, settings.length); for (int i = 0; i < settings.length % 6; i++) { int id = ByteUtil.getTwoBytes(settings, i * 6); Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java?rev=1684277&r1=1684276&r2=1684277&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java (original) +++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java Mon Jun 8 20:53:39 2015 @@ -89,5 +89,31 @@ public class TestHttp2Section_4_2 extend } - // TODO Test connection vs stream error on a stream other than zero + @Test + public void testFrameTypeLimitsStream() throws Exception { + hpackEncoder = new HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE); + + // HTTP2 upgrade + http2Connect(); + + // Invalid priority + byte[] ping = new byte[9]; + + // Header + // Length 0 + // Type + ping[3] = FrameType.PRIORITY.getIdByte(); + // No flags + // Stream 3 + ByteUtil.set31Bits(ping, 5, 3); + // Empty payload + + os.write(ping); + + // Read GOAWAY frame + parser.readFrame(true); + + Assert.assertTrue(output.getTrace(), + output.getTrace().startsWith("3-RST-[6]")); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org