From 46f6e1d360f459a7e1b6654cffe2796b62d8192f Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 10 Jul 2013 22:10:48 +0200 Subject: [PATCH] [#1542] Fix resource-leak in HttpObjectAggregator when a too long frame was detected --- .../netty/handler/codec/http/HttpObjectAggregator.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectAggregator.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectAggregator.java index 0cd13b4e02..7b6dd00841 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectAggregator.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectAggregator.java @@ -124,7 +124,7 @@ public class HttpObjectAggregator extends MessageToMessageDecoder { // No need to notify the upstream handlers - just log. // If decoding a response, just throw an exception. if (is100ContinueExpected(m)) { - ctx.write(CONTINUE.duplicate()); + ctx.writeAndFlush(CONTINUE.duplicate()); } if (!m.getDecoderResult().isSuccess()) { @@ -151,8 +151,6 @@ public class HttpObjectAggregator extends MessageToMessageDecoder { // A streamed message - initialize the cumulative buffer, and wait for incoming chunks. removeTransferEncodingChunked(currentMessage); } else if (msg instanceof HttpContent) { - assert currentMessage != null; - if (tooLongFrameFound) { if (msg instanceof LastHttpContent) { this.currentMessage = null; @@ -160,6 +158,7 @@ public class HttpObjectAggregator extends MessageToMessageDecoder { // already detect the too long frame so just discard the content return; } + assert currentMessage != null; // Merge the received chunk into the content of the current message. HttpContent chunk = (HttpContent) msg; @@ -168,6 +167,10 @@ public class HttpObjectAggregator extends MessageToMessageDecoder { if (content.readableBytes() > maxContentLength - chunk.content().readableBytes()) { tooLongFrameFound = true; + // release current message to prevent leaks + currentMessage.release(); + this.currentMessage = null; + throw new TooLongFrameException( "HTTP content length exceeded " + maxContentLength + " bytes.");