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 2015/06/23 21:28:15 UTC

svn commit: r1687119 - in /tomcat/trunk: java/org/apache/coyote/http2/Http2Parser.java java/org/apache/coyote/http2/LocalStrings.properties test/org/apache/coyote/http2/TestHttp2Section_6_2.java

Author: markt
Date: Tue Jun 23 19:28:15 2015
New Revision: 1687119

URL: http://svn.apache.org/r1687119
Log:
Add some more header frame + padding tests
Fix a bug in the parser (it didn't catch padding >= payload)

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
    tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java

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=1687119&r1=1687118&r2=1687119&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Tue Jun 23 19:28:15 2015
@@ -144,7 +144,7 @@ class Http2Parser {
 
             if (padLength >= payloadSize) {
                 throw new ConnectionException(
-                        sm.getString("http2Parser.processFrameData.tooMuchPadding", connectionId,
+                        sm.getString("http2Parser.processFrame.tooMuchPadding", connectionId,
                                 Integer.toString(streamId), Integer.toString(padLength),
                                 Integer.toString(payloadSize)), Http2Error.PROTOCOL_ERROR);
             }
@@ -216,6 +216,12 @@ class Http2Parser {
             int optionalPos = 0;
             if (padding) {
                 padLength = ByteUtil.getOneByte(optional, optionalPos++);
+                if (padLength >= payloadSize) {
+                    throw new ConnectionException(
+                            sm.getString("http2Parser.processFrame.tooMuchPadding", connectionId,
+                                    Integer.toString(streamId), Integer.toString(padLength),
+                                    Integer.toString(payloadSize)), Http2Error.PROTOCOL_ERROR);
+                }
             }
             if (priority) {
                 boolean exclusive = ByteUtil.isBit7Set(optional[optionalPos]);

Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1687119&r1=1687118&r2=1687119&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Jun 23 19:28:15 2015
@@ -43,10 +43,10 @@ http2Parser.payloadTooBig=The payload is
 http2Parser.preface.invalid=Invalid connection preface [{0}] presented
 http2Parser.preface.io=Unable to read connection preface
 http2Parser.processFrame=Connection [{0}], Stream [{1}], Frame type [{2}], Flags [{3}], Payload size [{4}]
+http2Parser.processFrame.tooMuchPadding=Connection [{0}], Stream [{1}], The padding length [{2}] was too big for the payload [{3}]
 http2Parser.processFrame.unexpectedType=Expected frame type [{0}] but received frame type [{1}]
 http2Parser.processFrameContinuation.notExpected=Connection [{0}], Continuation frame received for stream [{1}] when no headers were in progress
 http2Parser.processFrameData.lengths=Connection [{0}], Stream [{1}], Data length, [{2}], Padding length [{3}]
-http2Parser.processFrameData.tooMuchPadding=Connection [{0}], Stream [{1}], The padding length [{2}] was too big for the payload [{3}]
 http2Parser.processFrameGoaway.payloadTooSmall=Connection [{0}]: Goaway payload size was [{1}] which is less than the minimum 8
 http2Parser.processFrameHeaders.decodingFailed=There was an error during the HPACK decoding of HTTP headers
 http2Parser.processFrameHeaders.decodingDataLeft=Data left over after HPACK decoding - it should have been consumed

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java?rev=1687119&r1=1687118&r2=1687119&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java Tue Jun 23 19:28:15 2015
@@ -58,12 +58,62 @@ public class TestHttp2Section_6_2 extend
         sendSimpleGetRequest(3, padding);
         readSimpleGetResponse();
         Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace());
-        output.clearTrace();
     }
 
-    // with non-zero padding
 
-    // too much padding
+    @Test
+    public void testHeaderFrameWithNonZeroPadding() throws Exception {
+        http2Connect();
 
-    // zero length padding
+        byte[] padding= new byte[8];
+        padding[4] = 1;
+
+        sendSimpleGetRequest(3, padding);
+
+        // Goaway
+        parser.readFrame(true);
+
+        Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
+                "0-Goaway-[1]-[" + Http2Error.PROTOCOL_ERROR.getCode() + "]-["));
+    }
+
+
+    @Test
+    public void testHeaderFrameTooMuchPadding() throws Exception {
+        http2Connect();
+
+        byte[] headerFrame = new byte[10];
+
+        // Header
+        // length
+        ByteUtil.setThreeBytes(headerFrame, 0, 1);
+        // type 1 (headers)
+        headerFrame[3] = 0x01;
+        // flags 8 (padded)
+        headerFrame[4] = 0x08;
+        // stream 3
+        ByteUtil.set31Bits(headerFrame, 5, 3);
+        // payload (pad length of 1)
+        headerFrame[9] = 1;
+
+        os.write(headerFrame);
+        os.flush();
+
+        parser.readFrame(true);
+
+        String trace = output.getTrace();
+        Assert.assertTrue(trace, trace.startsWith("0-Goaway-[1]-[1]-["));
+    }
+
+
+    @Test
+    public void testHeaderFrameWithZeroLengthPadding() throws Exception {
+        http2Connect();
+
+        byte[] padding= new byte[0];
+
+        sendSimpleGetRequest(3, padding);
+        readSimpleGetResponse();
+        Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace());
+    }
 }



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