diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java index 2443cca0b0..f5d3247ef0 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java @@ -149,13 +149,18 @@ public class HttpPostStandardRequestDecoder implements InterfaceHttpPostRequestD this.request = requireNonNull(request, "request"); this.charset = requireNonNull(charset, "charset"); this.factory = requireNonNull(factory, "factory"); - if (request instanceof HttpContent) { - // Offer automatically if the given request is als type of HttpContent - // See #1089 - offer((HttpContent) request); - } else { - undecodedChunk = buffer(); - parseBody(); + try { + if (request instanceof HttpContent) { + // Offer automatically if the given request is als type of HttpContent + // See #1089 + offer((HttpContent) request); + } else { + undecodedChunk = buffer(); + parseBody(); + } + } catch (HttpPostRequestDecoder.ErrorDataDecoderException e) { + destroy(); + throw e; } } diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java index 7cd0d2c313..6e6e3cbf35 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java @@ -723,4 +723,15 @@ public class HttpPostRequestDecoderTest { decoder.destroy(); assertEquals(1, req.refCnt()); } + + @Test(expected = HttpPostRequestDecoder.ErrorDataDecoderException.class) + public void testNotLeak() { + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", + Unpooled.copiedBuffer("a=1&&b=2", CharsetUtil.US_ASCII)); + try { + new HttpPostStandardRequestDecoder(request); + } finally { + assertTrue(request.release()); + } + } }