diff --git a/buffer/src/main/java/io/netty/buffer/CompositeChannelBuffer.java b/buffer/src/main/java/io/netty/buffer/CompositeChannelBuffer.java index e960ffab18..7d639bb6dd 100644 --- a/buffer/src/main/java/io/netty/buffer/CompositeChannelBuffer.java +++ b/buffer/src/main/java/io/netty/buffer/CompositeChannelBuffer.java @@ -655,6 +655,15 @@ public class CompositeChannelBuffer extends AbstractChannelBuffer { final int bytesToMove = capacity() - localReaderIndex; List list = decompose(localReaderIndex, bytesToMove); + + // If the list is empty we need to assign a new one because + // we get a List that is immutable. + // + // See https://github.com/netty/netty/issues/325 + if (list.isEmpty()) { + list = new ArrayList(1); + } + // Add a new buffer so that the capacity of this composite buffer does // not decrease due to the discarded components. // XXX Might create too many components if discarded by small amount. diff --git a/buffer/src/test/java/io/netty/buffer/AbstractChannelBufferTest.java b/buffer/src/test/java/io/netty/buffer/AbstractChannelBufferTest.java index 8e3df60f54..73e7ef80ee 100644 --- a/buffer/src/test/java/io/netty/buffer/AbstractChannelBufferTest.java +++ b/buffer/src/test/java/io/netty/buffer/AbstractChannelBufferTest.java @@ -1641,4 +1641,12 @@ public abstract class AbstractChannelBufferTest { assertFalse(set.contains(elemB)); assertEquals(0, set.size()); } + + // Test case for https://github.com/netty/netty/issues/325 + @Test + public void testDiscardAllReadBytes() { + buffer.writerIndex(buffer.capacity()); + buffer.readerIndex(buffer.writerIndex()); + buffer.discardReadBytes(); + } }