diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index 30ccd985b7..920763aa59 100755 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -598,9 +598,27 @@ final class DefaultChannelPipeline implements ChannelPipeline { } } - private static void callAfterRemove(ChannelHandlerContext ctx) { + private void callAfterRemove(ChannelHandlerContext ctx) { + // Free all buffers before completing removal. + ChannelHandler handler = ctx.handler(); + if (handler instanceof ChannelInboundHandler) { + try { + ((ChannelInboundHandler) handler).freeInboundBuffer(ctx); + } catch (Exception e) { + notifyHandlerException(e); + } + } + if (handler instanceof ChannelOutboundHandler) { + try { + ((ChannelOutboundHandler) handler).freeOutboundBuffer(ctx); + } catch (Exception e) { + notifyHandlerException(e); + } + } + + // Notify the complete removal. try { - ctx.handler().afterRemove(ctx); + handler.afterRemove(ctx); } catch (Throwable t) { throw new ChannelPipelineException( ctx.handler().getClass().getName() +