diff --git a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java index 079cea7b8d..ebb05b50e7 100644 --- a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java +++ b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoderBuffer.java @@ -137,19 +137,19 @@ class ReplayingDecoderBuffer implements ByteBuf { @Override public boolean getBoolean(int index) { - checkIndex(index); + checkIndex(index, 1); return buffer.getBoolean(index); } @Override public byte getByte(int index) { - checkIndex(index); + checkIndex(index, 1); return buffer.getByte(index); } @Override public short getUnsignedByte(int index) { - checkIndex(index); + checkIndex(index, 1); return buffer.getUnsignedByte(index); } @@ -801,12 +801,6 @@ class ReplayingDecoderBuffer implements ByteBuf { throw new UnreplayableOperationException(); } - private void checkIndex(int index) { - if (index > buffer.writerIndex()) { - throw REPLAY; - } - } - private void checkIndex(int index, int length) { if (index + length > buffer.writerIndex()) { throw REPLAY; diff --git a/codec/src/test/java/io/netty/handler/codec/ReplayingDecoderBufferTest.java b/codec/src/test/java/io/netty/handler/codec/ReplayingDecoderBufferTest.java new file mode 100644 index 0000000000..2d3f15b2cb --- /dev/null +++ b/codec/src/test/java/io/netty/handler/codec/ReplayingDecoderBufferTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2012 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package io.netty.handler.codec; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.util.CharsetUtil; +import io.netty.util.Signal; + +import org.junit.Test; + +public class ReplayingDecoderBufferTest { + + /** + * See https://github.com/netty/netty/issues/445 + */ + @Test + public void testGetUnsignedByte() { + ReplayingDecoderBuffer buffer = new ReplayingDecoderBuffer(Unpooled.copiedBuffer("TestBuffer", CharsetUtil.ISO_8859_1)); + + boolean error; + int i = 0; + try { + for (;;) { + buffer.getUnsignedByte(i); + i++; + } + } catch (Signal e) { + error = true; + } + + assertTrue(error); + assertEquals(10, i); + } + + /** + * See https://github.com/netty/netty/issues/445 + */ + @Test + public void testGetByte() { + ReplayingDecoderBuffer buffer = new ReplayingDecoderBuffer(Unpooled.copiedBuffer("TestBuffer", CharsetUtil.ISO_8859_1)); + + boolean error; + int i = 0; + try { + for (;;) { + buffer.getByte(i); + i++; + } + } catch (Signal e) { + error = true; + } + + assertTrue(error); + assertEquals(10, i); + } + + /** + * See https://github.com/netty/netty/issues/445 + */ + @Test + public void testGetBoolean() { + ByteBuf buf = Unpooled.buffer(10); + while(buf.writable()) { + buf.writeBoolean(true); + } + ReplayingDecoderBuffer buffer = new ReplayingDecoderBuffer(buf); + + boolean error; + int i = 0; + try { + for (;;) { + buffer.getBoolean(i); + i++; + } + } catch (Signal e) { + error = true; + } + + assertTrue(error); + assertEquals(10, i); + } + +}