From dc1b511fcf6d5f902c7ca475cbaa7fdd026c62f1 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 4 Sep 2018 19:13:56 +0200 Subject: [PATCH] Correctly reset offset when fail lazy because of too long frame. (#8257) Motivation: We need to reset the offset to 0 when we fail lazy because of a too long frame. Modifications: - Reset offset - Add testcase Result: Fixes https://github.com/netty/netty/issues/8256. --- .../handler/codec/LineBasedFrameDecoder.java | 2 ++ .../codec/LineBasedFrameDecoderTest.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java index 305981b762..58f2e85f04 100644 --- a/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java @@ -137,6 +137,8 @@ public class LineBasedFrameDecoder extends ByteToMessageDecoder { } else { discardedBytes += buffer.readableBytes(); buffer.readerIndex(buffer.writerIndex()); + // We skip everything in the buffer, we need to set the offset to 0 again. + offset = 0; } return null; } diff --git a/codec/src/test/java/io/netty/handler/codec/LineBasedFrameDecoderTest.java b/codec/src/test/java/io/netty/handler/codec/LineBasedFrameDecoderTest.java index b68c38bbbe..9edd178fa2 100644 --- a/codec/src/test/java/io/netty/handler/codec/LineBasedFrameDecoderTest.java +++ b/codec/src/test/java/io/netty/handler/codec/LineBasedFrameDecoderTest.java @@ -185,4 +185,27 @@ public class LineBasedFrameDecoderTest { buf.release(); buf2.release(); } + + @Test + public void testNotFailFast() throws Exception { + EmbeddedChannel ch = new EmbeddedChannel(new LineBasedFrameDecoder(2, false, false)); + assertFalse(ch.writeInbound(wrappedBuffer(new byte[] { 0, 1, 2 }))); + assertFalse(ch.writeInbound(wrappedBuffer(new byte[]{ 3, 4 }))); + try { + ch.writeInbound(wrappedBuffer(new byte[] { '\n' })); + fail(); + } catch (TooLongFrameException expected) { + // Expected once we received a full frame. + } + assertFalse(ch.writeInbound(wrappedBuffer(new byte[] { '5' }))); + assertTrue(ch.writeInbound(wrappedBuffer(new byte[] { '\n' }))); + + ByteBuf expected = wrappedBuffer(new byte[] { '5', '\n' }); + ByteBuf buffer = ch.readInbound(); + assertEquals(expected, buffer); + expected.release(); + buffer.release(); + + assertFalse(ch.finish()); + } }