From c32c520edde1bd554314f51d76b3eda4858e404c Mon Sep 17 00:00:00 2001 From: skyguard1 Date: Thu, 29 Apr 2021 14:13:11 +0800 Subject: [PATCH] Before throwing TooLongFrameException,should skip the bytes to be read in MqttDecoder (#11204) Motivation: Before throwing TooLongFrameException, should call the skipBytes method to skip the bytes to be read Modification: - skip bytes before throw Result: Actually skip the bytes when we detect too much data Signed-off-by: xingrufei Co-authored-by: xingrufei --- .../io/netty/handler/codec/mqtt/MqttDecoder.java | 1 + .../io/netty/handler/codec/mqtt/MqttCodecTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttDecoder.java b/codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttDecoder.java index 71065ef66b..8db7c3360f 100644 --- a/codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttDecoder.java +++ b/codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttDecoder.java @@ -98,6 +98,7 @@ public final class MqttDecoder extends ReplayingDecoder { final Result decodedVariableHeader = decodeVariableHeader(ctx, buffer, mqttFixedHeader); variableHeader = decodedVariableHeader.value; if (bytesRemainingInVariablePart > maxBytesInMessage) { + buffer.skipBytes(buffer.readableBytes()); throw new TooLongFrameException("too large message: " + bytesRemainingInVariablePart + " bytes"); } bytesRemainingInVariablePart -= decodedVariableHeader.numberOfBytesConsumed; diff --git a/codec-mqtt/src/test/java/io/netty/handler/codec/mqtt/MqttCodecTest.java b/codec-mqtt/src/test/java/io/netty/handler/codec/mqtt/MqttCodecTest.java index 23e40f0140..943c284e85 100644 --- a/codec-mqtt/src/test/java/io/netty/handler/codec/mqtt/MqttCodecTest.java +++ b/codec-mqtt/src/test/java/io/netty/handler/codec/mqtt/MqttCodecTest.java @@ -334,6 +334,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); @@ -356,6 +358,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); @@ -378,6 +382,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); validateDecoderExceptionTooLargeMessage(decodedMessage); @@ -397,6 +403,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); @@ -419,6 +427,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); validateMessageIdVariableHeader(message.variableHeader(), @@ -440,6 +450,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); validateMessageIdVariableHeader(message.variableHeader(), @@ -461,6 +473,8 @@ public class MqttCodecTest { assertEquals("Expected one object but got " + out.size(), 1, out.size()); + assertEquals(0, byteBuf.readableBytes()); + final MqttMessage decodedMessage = (MqttMessage) out.get(0); validateFixedHeaders(message.fixedHeader(), decodedMessage.fixedHeader()); validateMessageIdVariableHeader(message.variableHeader(),