diff --git a/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java b/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java index ffc4b86b76..eb6bf8651e 100644 --- a/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java +++ b/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java @@ -630,7 +630,14 @@ 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(); + } // 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/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java index 4ebf42719c..d6f7812e8a 100644 --- a/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java +++ b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java @@ -1704,4 +1704,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(); + } }