diff --git a/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java index bfdc14628b..3f20698f63 100644 --- a/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/compression/SnappyFrameDecoder.java @@ -19,7 +19,6 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; -import java.util.Arrays; import java.util.List; import static io.netty.handler.codec.compression.Snappy.validateChecksum; @@ -45,7 +44,7 @@ public class SnappyFrameDecoder extends ByteToMessageDecoder { RESERVED_SKIPPABLE } - private static final byte[] SNAPPY = { 's', 'N', 'a', 'P', 'p', 'Y' }; + private static final int SNAPPY_IDENTIFIER_LEN = 6; private static final int MAX_UNCOMPRESSED_DATA_SIZE = 65536 + 4; private final Snappy snappy = new Snappy(); @@ -98,21 +97,24 @@ public class SnappyFrameDecoder extends ByteToMessageDecoder { switch (chunkType) { case STREAM_IDENTIFIER: - if (chunkLength != SNAPPY.length) { + if (chunkLength != SNAPPY_IDENTIFIER_LEN) { throw new DecompressionException("Unexpected length of stream identifier: " + chunkLength); } - if (inSize < 4 + SNAPPY.length) { + if (inSize < 4 + SNAPPY_IDENTIFIER_LEN) { break; } - byte[] identifier = new byte[chunkLength]; - in.skipBytes(4).readBytes(identifier); + in.skipBytes(4); + int offset = in.readerIndex(); + in.skipBytes(SNAPPY_IDENTIFIER_LEN); - if (!Arrays.equals(identifier, SNAPPY)) { - throw new DecompressionException("Unexpected stream identifier contents. Mismatched snappy " + - "protocol version?"); - } + checkByte(in.getByte(offset++), (byte) 's'); + checkByte(in.getByte(offset++), (byte) 'N'); + checkByte(in.getByte(offset++), (byte) 'a'); + checkByte(in.getByte(offset++), (byte) 'P'); + checkByte(in.getByte(offset++), (byte) 'p'); + checkByte(in.getByte(offset), (byte) 'Y'); started = true; break; @@ -196,6 +198,13 @@ public class SnappyFrameDecoder extends ByteToMessageDecoder { } } + private static void checkByte(byte actual, byte expect) { + if (actual != expect) { + throw new DecompressionException("Unexpected stream identifier contents. Mismatched snappy " + + "protocol version?"); + } + } + /** * Decodes the chunk type from the type tag byte. *