diff --git a/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java b/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java index 8d9f7deb8d..a4ccb5aee4 100644 --- a/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java @@ -207,18 +207,23 @@ public abstract class ByteToMessageDecoder extends ChannelInboundHandlerAdapter @Override public final void handlerRemoved(ChannelHandlerContext ctx) throws Exception { - ByteBuf buf = internalBuffer(); - int readable = buf.readableBytes(); - if (readable > 0) { - ByteBuf bytes = buf.readBytes(readable); - buf.release(); - ctx.fireChannelRead(bytes); - } else { - buf.release(); + ByteBuf buf = cumulation; + if (buf != null) { + // Directly set this to null so we are sure we not access it in any other method here anymore. + cumulation = null; + + int readable = buf.readableBytes(); + if (readable > 0) { + ByteBuf bytes = buf.readBytes(readable); + buf.release(); + ctx.fireChannelRead(bytes); + } else { + buf.release(); + } + + numReads = 0; + ctx.fireChannelReadComplete(); } - cumulation = null; - numReads = 0; - ctx.fireChannelReadComplete(); handlerRemoved0(ctx); } diff --git a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java index 1fa42b242c..e3116b38af 100644 --- a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java @@ -21,7 +21,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.util.Signal; -import io.netty.util.internal.RecyclableArrayList; import io.netty.util.internal.StringUtil; import java.util.List;