From e21591fa251144f39d108deeee9508e470dbb713 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Thu, 26 Aug 2021 08:20:17 +0200 Subject: [PATCH] Don't throw if null is given as ByteBuf when adding components. (#11613) Motivation: 232c669fa413a9079ee6216056b57a647143f4b6 did add some overflow protection but did not handle null elements in the array the same as before. Modifications: - Break the loop if a null element was found - Add unit test Result: Fixes https://github.com/netty/netty/issues/11612 --- .../java/io/netty/buffer/CompositeByteBuf.java | 6 +++++- .../netty/buffer/AbstractCompositeByteBufTest.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java b/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java index 1cde1fff8e..8a32dd27ac 100644 --- a/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java @@ -374,7 +374,11 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf implements int readableBytes = 0; int capacity = capacity(); for (int i = arrOffset; i < buffers.length; i++) { - readableBytes += buffers[i].readableBytes(); + ByteBuf b = buffers[i]; + if (b == null) { + break; + } + readableBytes += b.readableBytes(); // Check if we would overflow. // See https://github.com/netty/netty/issues/10194 diff --git a/buffer/src/test/java/io/netty/buffer/AbstractCompositeByteBufTest.java b/buffer/src/test/java/io/netty/buffer/AbstractCompositeByteBufTest.java index 3d88df0cdf..8d84d12b77 100644 --- a/buffer/src/test/java/io/netty/buffer/AbstractCompositeByteBufTest.java +++ b/buffer/src/test/java/io/netty/buffer/AbstractCompositeByteBufTest.java @@ -1555,6 +1555,20 @@ public abstract class AbstractCompositeByteBufTest extends AbstractByteBufTest { assertTrue(cbuf.release()); } + // See https://github.com/netty/netty/issues/11612 + @Test + public void testAddComponentWithNullEntry() { + final ByteBuf buffer = Unpooled.buffer(8).writeZero(8); + final CompositeByteBuf compositeByteBuf = compositeBuffer(Integer.MAX_VALUE); + try { + compositeByteBuf.addComponents(true, new ByteBuf[] { buffer, null }); + assertEquals(8, compositeByteBuf.readableBytes()); + assertEquals(1, compositeByteBuf.numComponents()); + } finally { + compositeByteBuf.release(); + } + } + @Test public void testOverflowWhileAddingComponent() { int capacity = 1024 * 1024; // 1MB