From 7db3e01498ded8de43ed18b9fe2f14c11ac2d846 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 20 Jul 2016 06:35:05 +0200 Subject: [PATCH] Ensure uncompressed ByteBuf is released when an exception happens during decoding. Motivation: We need to ensure the uncompressed ByteBuf is released if an exception happens while calling decode(...). If we miss to do so we leak buffers. Modifications: Correctly release buffer on exception. Result: No more memory leak. --- .../codec/compression/SnappyFrameDecoder.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) 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 30af58d050..bfdc14628b 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 @@ -166,20 +166,27 @@ public class SnappyFrameDecoder extends ByteToMessageDecoder { in.skipBytes(4); int checksum = in.readIntLE(); - ByteBuf uncompressed = ctx.alloc().buffer(0); - if (validateChecksums) { - int oldWriterIndex = in.writerIndex(); - try { - in.writerIndex(in.readerIndex() + chunkLength - 4); - snappy.decode(in, uncompressed); - } finally { - in.writerIndex(oldWriterIndex); + ByteBuf uncompressed = ctx.alloc().buffer(); + try { + if (validateChecksums) { + int oldWriterIndex = in.writerIndex(); + try { + in.writerIndex(in.readerIndex() + chunkLength - 4); + snappy.decode(in, uncompressed); + } finally { + in.writerIndex(oldWriterIndex); + } + validateChecksum(checksum, uncompressed, 0, uncompressed.writerIndex()); + } else { + snappy.decode(in.readSlice(chunkLength - 4), uncompressed); + } + out.add(uncompressed); + uncompressed = null; + } finally { + if (uncompressed != null) { + uncompressed.release(); } - validateChecksum(checksum, uncompressed, 0, uncompressed.writerIndex()); - } else { - snappy.decode(in.readSlice(chunkLength - 4), uncompressed); } - out.add(uncompressed); snappy.reset(); break; }