This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 6a52ef0613c418a9ba0bb74c46ca90ee510a9069 Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Mar 15 18:50:29 2021 +0000 Add frameTypeId parameter to swallowedPayload() --- java/org/apache/coyote/http2/FrameType.java | 5 ++++ java/org/apache/coyote/http2/Http2Parser.java | 37 +++++++++++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/java/org/apache/coyote/http2/FrameType.java b/java/org/apache/coyote/http2/FrameType.java index d671f10..44e5b55 100644 --- a/java/org/apache/coyote/http2/FrameType.java +++ b/java/org/apache/coyote/http2/FrameType.java @@ -51,6 +51,11 @@ enum FrameType { } + int getId() { + return id; + } + + byte getIdByte() { return (byte) id; } diff --git a/java/org/apache/coyote/http2/Http2Parser.java b/java/org/apache/coyote/http2/Http2Parser.java index 2bcfb2a..42647c8 100644 --- a/java/org/apache/coyote/http2/Http2Parser.java +++ b/java/org/apache/coyote/http2/Http2Parser.java @@ -78,14 +78,15 @@ class Http2Parser { } int payloadSize = ByteUtil.getThreeBytes(frameHeaderBuffer, 0); - FrameType frameType = FrameType.valueOf(ByteUtil.getOneByte(frameHeaderBuffer, 3)); + int frameTypeId = ByteUtil.getOneByte(frameHeaderBuffer, 3); + FrameType frameType = FrameType.valueOf(frameTypeId); int flags = ByteUtil.getOneByte(frameHeaderBuffer, 4); int streamId = ByteUtil.get31Bits(frameHeaderBuffer, 5); try { validateFrame(expected, frameType, streamId, flags, payloadSize); } catch (StreamException se) { - swallowPayload(streamId, payloadSize, false); + swallowPayload(streamId, frameTypeId, payloadSize, false); throw se; } @@ -166,11 +167,11 @@ class Http2Parser { ByteBuffer dest = output.startRequestBodyFrame(streamId, payloadSize, endOfStream); if (dest == null) { - swallowPayload(streamId, dataLength, false); + swallowPayload(streamId, FrameType.DATA.getId(), dataLength, false); // Process padding before sending any notifications in case padding // is invalid. if (padLength > 0) { - swallowPayload(streamId, padLength, true); + swallowPayload(streamId, FrameType.DATA.getId(), padLength, true); } if (endOfStream) { output.receivedEndOfStream(streamId); @@ -178,7 +179,7 @@ class Http2Parser { } else { synchronized (dest) { if (dest.remaining() < dataLength) { - swallowPayload(streamId, dataLength, false); + swallowPayload(streamId, FrameType.DATA.getId(), dataLength, false); // Client has sent more data than permitted by Window size throw new StreamException(sm.getString("http2Parser.processFrameData.window", connectionId), Http2Error.FLOW_CONTROL_ERROR, streamId); @@ -187,7 +188,7 @@ class Http2Parser { // Process padding before sending any notifications in case // padding is invalid. if (padLength > 0) { - swallowPayload(streamId, padLength, true); + swallowPayload(streamId, FrameType.DATA.getId(), padLength, true); } if (endOfStream) { output.receivedEndOfStream(streamId); @@ -212,7 +213,7 @@ class Http2Parser { try { hpackDecoder.setHeaderEmitter(output.headersStart(streamId, headersEndStream)); } catch (StreamException se) { - swallowPayload(streamId, payloadSize, false); + swallowPayload(streamId, FrameType.HEADERS.getId(), payloadSize, false); throw se; } @@ -252,7 +253,7 @@ class Http2Parser { readHeaderPayload(streamId, payloadSize); - swallowPayload(streamId, padLength, true); + swallowPayload(streamId, FrameType.HEADERS.getId(), padLength, true); if (Flags.isEndOfHeaders(flags)) { onHeadersComplete(streamId); @@ -461,7 +462,7 @@ class Http2Parser { private void readUnknownFrame(int streamId, FrameType frameType, int flags, int payloadSize) throws IOException { try { - swallowPayload(streamId, payloadSize, false); + swallowPayload(streamId, frameType.getId(), payloadSize, false); } catch (ConnectionException e) { // Will never happen because swallow() is called with mustBeZero set // to false @@ -470,7 +471,21 @@ class Http2Parser { } - private void swallowPayload(int streamId, int len, boolean mustBeZero) + /** + * Swallow some or all of the bytes from the payload of an HTTP/2 frame. + * + * @param streamId Stream being swallowed + * @param frameTypeId Type of HTTP/2 frame for which the bytes will be + * swallowed + * @param len Number of bytes to swallow + * @param isPadding Are the bytes to be swallowed padding bytes? + * + * @throws IOException If an I/O error occurs reading additional bytes into + * the input buffer. + * @throws ConnectionException If the swallowed bytes are expected to have a + * value of zero but do not + */ + protected void swallowPayload(int streamId, int frameTypeId, int len, boolean isPadding) throws IOException, ConnectionException { if (log.isDebugEnabled()) { log.debug(sm.getString("http2Parser.swallow.debug", connectionId, @@ -484,7 +499,7 @@ class Http2Parser { while (read < len) { int thisTime = Math.min(buffer.length, len - read); input.fill(true, buffer, 0, thisTime); - if (mustBeZero) { + if (isPadding) { // Validate the padding is zero since receiving non-zero padding // is a strong indication of either a faulty client or a server // side bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org