From ecb215c12fc68ff53bdc353d51205a7f20af778e Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Sun, 14 Jul 2013 22:50:53 +0200 Subject: [PATCH] Fix buffer leaks --- .../io/netty/handler/codec/http/HttpContentDecoder.java | 5 ++++- .../codec/http/multipart/HttpPostRequestEncoder.java | 6 ++++-- .../java/io/netty/handler/codec/string/StringEncoder.java | 6 +++++- .../example/http/file/HttpStaticFileServerHandler.java | 6 ++++-- .../http/websocketx/autobahn/AutobahnServerHandler.java | 5 ++++- .../http/websocketx/server/WebSocketServerHandler.java | 4 +++- .../websocketx/sslserver/WebSocketSslServerHandler.java | 4 +++- 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java index 992f281f0f..41a75f15a0 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java @@ -211,7 +211,9 @@ public abstract class HttpContentDecoder extends MessageToMessageDecoder { HttpContent chunk = nextChunk(); if (request instanceof FullHttpRequest) { FullHttpRequest fullRequest = (FullHttpRequest) request; - if (!fullRequest.content().equals(chunk.content())) { - fullRequest.content().clear().writeBytes(chunk.content()); + ByteBuf chunkContent = chunk.content(); + if (fullRequest.content() != chunkContent) { + fullRequest.content().clear().writeBytes(chunkContent); + chunkContent.release(); } return fullRequest; } else { diff --git a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java index cffbcdc44b..9c4ea383be 100644 --- a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java @@ -76,6 +76,10 @@ public class StringEncoder extends MessageToByteEncoder { } ByteBuf encoded = Unpooled.copiedBuffer(msg, charset); - out.writeBytes(encoded); + try { + out.writeBytes(encoded); + } finally { + encoded.release(); + } } } diff --git a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java index 087ea0dadc..c14418948f 100644 --- a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java +++ b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java @@ -15,6 +15,7 @@ */ package io.netty.example.http.file; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -272,8 +273,9 @@ public class HttpStaticFileServerHandler extends SimpleChannelInboundHandler\r\n"); - - response.content().writeBytes(Unpooled.copiedBuffer(buf, CharsetUtil.UTF_8)); + ByteBuf buffer = Unpooled.copiedBuffer(buf, CharsetUtil.UTF_8); + response.content().writeBytes(buffer); + buffer.release(); // Close the connection as soon as the error message is sent. ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); diff --git a/example/src/main/java/io/netty/example/http/websocketx/autobahn/AutobahnServerHandler.java b/example/src/main/java/io/netty/example/http/websocketx/autobahn/AutobahnServerHandler.java index e58597f826..9327aeddb6 100644 --- a/example/src/main/java/io/netty/example/http/websocketx/autobahn/AutobahnServerHandler.java +++ b/example/src/main/java/io/netty/example/http/websocketx/autobahn/AutobahnServerHandler.java @@ -15,6 +15,7 @@ */ package io.netty.example.http.websocketx.autobahn; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -122,7 +123,9 @@ public class AutobahnServerHandler extends ChannelInboundHandlerAdapter { ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) { // Generate an error page if response getStatus code is not OK (200). if (res.getStatus().code() != 200) { - res.content().writeBytes(Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8)); + ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8); + res.content().writeBytes(buf); + buf.release(); setContentLength(res, res.content().readableBytes()); } diff --git a/example/src/main/java/io/netty/example/http/websocketx/server/WebSocketServerHandler.java b/example/src/main/java/io/netty/example/http/websocketx/server/WebSocketServerHandler.java index bf92ed8ba0..732b178e1c 100644 --- a/example/src/main/java/io/netty/example/http/websocketx/server/WebSocketServerHandler.java +++ b/example/src/main/java/io/netty/example/http/websocketx/server/WebSocketServerHandler.java @@ -135,7 +135,9 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) { // Generate an error page if response getStatus code is not OK (200). if (res.getStatus().code() != 200) { - res.content().writeBytes(Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8)); + ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8); + res.content().writeBytes(buf); + buf.release(); setContentLength(res, res.content().readableBytes()); } diff --git a/example/src/main/java/io/netty/example/http/websocketx/sslserver/WebSocketSslServerHandler.java b/example/src/main/java/io/netty/example/http/websocketx/sslserver/WebSocketSslServerHandler.java index b83be4895a..077816f961 100644 --- a/example/src/main/java/io/netty/example/http/websocketx/sslserver/WebSocketSslServerHandler.java +++ b/example/src/main/java/io/netty/example/http/websocketx/sslserver/WebSocketSslServerHandler.java @@ -132,7 +132,9 @@ public class WebSocketSslServerHandler extends SimpleChannelInboundHandler