From a8d63a4ad752582535a835ea10eb4e587f55cff7 Mon Sep 17 00:00:00 2001 From: norman Date: Tue, 15 May 2012 13:59:33 +0200 Subject: [PATCH] Make sure CompositeChanneBuffer does not throw a UnsupportedOperationException if discardReadBytes() discard the whole content of the buffer. See #325 --- .../java/io/netty/buffer/CompositeChannelBuffer.java | 9 +++++++++ .../java/io/netty/buffer/AbstractChannelBufferTest.java | 8 ++++++++ 2 files changed, 17 insertions(+) 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(); + } }