diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/netty/MinecraftVarintFrameDecoder.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/netty/MinecraftVarintFrameDecoder.java index 6a114075c..01010fa82 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/netty/MinecraftVarintFrameDecoder.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/netty/MinecraftVarintFrameDecoder.java @@ -11,36 +11,35 @@ public class MinecraftVarintFrameDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - if (!in.isReadable()) { - return; - } - - int origReaderIndex = in.readerIndex(); - for (int i = 0; i < 3; i++) { - if (!in.isReadable()) { - in.readerIndex(origReaderIndex); - return; - } - - byte read = in.readByte(); - if (read >= 0) { - // Make sure reader index of length buffer is returned to the beginning - in.readerIndex(origReaderIndex); - int packetLength = ProtocolUtils.readVarInt(in); - if (packetLength == 0) { - return; + int lastReaderIndex = in.readerIndex(); + find_packets: while (in.isReadable()) { + for (int i = 0; i < 3; i++) { + if (!in.isReadable()) { + break; } - if (in.readableBytes() < packetLength) { - in.readerIndex(origReaderIndex); - return; - } + byte read = in.readByte(); + if (read >= 0) { + // Make sure reader index of length buffer is returned to the beginning + in.readerIndex(lastReaderIndex); + int packetLength = ProtocolUtils.readVarInt(in); + if (packetLength == 0) { + break find_packets; + } - out.add(in.readRetainedSlice(packetLength)); - return; + if (in.readableBytes() < packetLength) { + break find_packets; + } + + out.add(in.readRetainedSlice(packetLength)); + lastReaderIndex = in.readerIndex(); + continue find_packets; + } } + + throw new CorruptedFrameException("VarInt too big"); } - throw new CorruptedFrameException("VarInt too big"); + in.readerIndex(lastReaderIndex); } }