diff --git a/buffer/src/main/java/io/netty/buffer/AbstractPooledDerivedByteBuf.java b/buffer/src/main/java/io/netty/buffer/AbstractPooledDerivedByteBuf.java index b66b88cfa1..38c5e084e0 100644 --- a/buffer/src/main/java/io/netty/buffer/AbstractPooledDerivedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/AbstractPooledDerivedByteBuf.java @@ -66,8 +66,12 @@ abstract class AbstractPooledDerivedByteBuf extends AbstractReferenceCountedB @Override protected final void deallocate() { + // We need to first store a reference to the wrapped buffer before recycle this instance. This is needed as + // otherwise it is possible that the same AbstractPooledDerivedByteBuf is again obtained and init(...) is + // called before we actually have a chance to call release(). This leads to call release() on the wrong buffer. + ByteBuf wrapped = unwrap(); recyclerHandle.recycle(this); - unwrap().release(); + wrapped.release(); } @Override