From 3c21b1cc4343b4a95c59dd197d0a2d50bac6cb83 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Tue, 24 Jun 2014 15:04:50 +0900 Subject: [PATCH] Fix buffer leak in DefaultFullBinaryMemcacheRequest/Response Motivation: DefaultFullBinaryMemcacheRequest/Response overrides release(), retain(), and touch() methods without calling its super, resulting in a leak of the extras. Modifications: When overriding release(), retain(), and touch(), ensure to call super. Result: Fixes #2533 by fixing the buffer leak --- .../DefaultFullBinaryMemcacheRequest.java | 18 ++++++++++++++++-- .../DefaultFullBinaryMemcacheResponse.java | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheRequest.java b/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheRequest.java index 04f46c55b2..8a04b8cf2e 100644 --- a/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheRequest.java +++ b/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheRequest.java @@ -65,45 +65,59 @@ public class DefaultFullBinaryMemcacheRequest extends DefaultBinaryMemcacheReque @Override public FullBinaryMemcacheRequest retain() { + super.retain(); content.retain(); return this; } @Override public FullBinaryMemcacheRequest retain(int increment) { + super.retain(increment); content.retain(increment); return this; } @Override public FullBinaryMemcacheRequest touch() { + super.touch(); content.touch(); return this; } @Override public FullBinaryMemcacheRequest touch(Object hint) { + super.touch(hint); content.touch(hint); return this; } @Override public boolean release() { + super.release(); return content.release(); } @Override public boolean release(int decrement) { + super.release(decrement); return content.release(decrement); } @Override public FullBinaryMemcacheRequest copy() { - return new DefaultFullBinaryMemcacheRequest(getKey(), getExtras(), content().copy()); + ByteBuf extras = getExtras(); + if (extras != null) { + extras = extras.copy(); + } + return new DefaultFullBinaryMemcacheRequest(getKey(), extras, content().copy()); } @Override public FullBinaryMemcacheRequest duplicate() { - return new DefaultFullBinaryMemcacheRequest(getKey(), getExtras(), content().duplicate()); + ByteBuf extras = getExtras(); + if (extras != null) { + extras = extras.duplicate(); + } + return new DefaultFullBinaryMemcacheRequest(getKey(), extras, content().duplicate()); } } diff --git a/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheResponse.java b/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheResponse.java index 87a3f4a45f..cc210df9b1 100644 --- a/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheResponse.java +++ b/codec-memcache/src/main/java/io/netty/handler/codec/memcache/binary/DefaultFullBinaryMemcacheResponse.java @@ -65,45 +65,59 @@ public class DefaultFullBinaryMemcacheResponse extends DefaultBinaryMemcacheResp @Override public FullBinaryMemcacheResponse retain() { + super.retain(); content.retain(); return this; } @Override public FullBinaryMemcacheResponse retain(int increment) { + super.retain(increment); content.retain(increment); return this; } @Override public FullBinaryMemcacheResponse touch() { + super.touch(); content.touch(); return this; } @Override public FullBinaryMemcacheResponse touch(Object hint) { + super.touch(hint); content.touch(hint); return this; } @Override public boolean release() { + super.release(); return content.release(); } @Override public boolean release(int decrement) { + super.release(decrement); return content.release(decrement); } @Override public FullBinaryMemcacheResponse copy() { - return new DefaultFullBinaryMemcacheResponse(getKey(), getExtras(), content().copy()); + ByteBuf extras = getExtras(); + if (extras != null) { + extras = extras.copy(); + } + return new DefaultFullBinaryMemcacheResponse(getKey(), extras, content().copy()); } @Override public FullBinaryMemcacheResponse duplicate() { - return new DefaultFullBinaryMemcacheResponse(getKey(), getExtras(), content().duplicate()); + ByteBuf extras = getExtras(); + if (extras != null) { + extras = extras.duplicate(); + } + return new DefaultFullBinaryMemcacheResponse(getKey(), extras, content().duplicate()); } }