From 06436efaa1b118eac3526d8f77d9e159d0292959 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 3 May 2016 10:32:25 +0200 Subject: [PATCH] [#5190] Ensure memory is not leaked when readEndOfLine(...) throws an exception. Motivation: We need to ensure we not retain the buffer until readEndOfLine(...) completes as otherwise we may leak memory in the case of an exception. Modifications: Only call retain after readEndOfLine(...) returns. Result: No more leak in case of exception while decoding redis messages. --- .../main/java/io/netty/handler/codec/redis/RedisDecoder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/codec-redis/src/main/java/io/netty/handler/codec/redis/RedisDecoder.java b/codec-redis/src/main/java/io/netty/handler/codec/redis/RedisDecoder.java index 54891a11c4..0fe9f6e509 100644 --- a/codec-redis/src/main/java/io/netty/handler/codec/redis/RedisDecoder.java +++ b/codec-redis/src/main/java/io/netty/handler/codec/redis/RedisDecoder.java @@ -205,9 +205,10 @@ public final class RedisDecoder extends ByteToMessageDecoder { // if this is last frame. if (readableBytes >= remainingBulkLength + RedisConstants.EOL_LENGTH) { - ByteBuf content = in.readSlice(remainingBulkLength).retain(); + ByteBuf content = in.readSlice(remainingBulkLength); readEndOfLine(in); - out.add(new DefaultLastBulkStringRedisContent(content)); + // Only call retain after readEndOfLine(...) as the method may throw an exception. + out.add(new DefaultLastBulkStringRedisContent(content.retain())); resetDecoder(); return true; }