From c0f1e9bd21b2311eb826f0901ca2e070904d1cc8 Mon Sep 17 00:00:00 2001 From: xiaoheng1 <2018154970@qq.com> Date: Mon, 1 Jul 2019 21:57:34 +0800 Subject: [PATCH] Fix public int read() throws IOException method exceeds the limit of length (#9306) Motivation: buffer.isReadable() should not be used to limit the amount of data that can be read as the amount may be less then was is readable. Modification: - Use available() which takes the length into account - Add unit test Result: Fixes https://github.com/netty/netty/issues/9305 --- .../io/netty/buffer/ByteBufInputStream.java | 3 +- .../io/netty/buffer/ByteBufStreamTest.java | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java b/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java index de4e4fbbb5..8b384e58c7 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java @@ -165,7 +165,8 @@ public class ByteBufInputStream extends InputStream implements DataInput { @Override public int read() throws IOException { - if (!buffer.isReadable()) { + int available = available(); + if (available == 0) { return -1; } return buffer.readByte() & 0xff; diff --git a/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java b/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java index 222ddcf7ee..989e160b22 100644 --- a/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java +++ b/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java @@ -212,4 +212,39 @@ public class ByteBufStreamTest { assertEquals(charCount, count); in.close(); } + + @Test + public void testRead() throws Exception { + // case1 + ByteBuf buf = Unpooled.buffer(16); + buf.writeBytes(new byte[]{1, 2, 3, 4, 5, 6}); + + ByteBufInputStream in = new ByteBufInputStream(buf, 3); + + assertEquals(1, in.read()); + assertEquals(2, in.read()); + assertEquals(3, in.read()); + assertEquals(-1, in.read()); + assertEquals(-1, in.read()); + assertEquals(-1, in.read()); + + buf.release(); + in.close(); + + // case2 + ByteBuf buf2 = Unpooled.buffer(16); + buf2.writeBytes(new byte[]{1, 2, 3, 4, 5, 6}); + + ByteBufInputStream in2 = new ByteBufInputStream(buf2, 4); + + assertEquals(1, in2.read()); + assertEquals(2, in2.read()); + assertEquals(3, in2.read()); + assertEquals(4, in2.read()); + assertNotEquals(5, in2.read()); + assertEquals(-1, in2.read()); + + buf2.release(); + in2.close(); + } }