[#1644] Fixed IndexOutOfBoundException when calling copy() on a empty CompositeByteBuf
This commit is contained in:
parent
5e4169802f
commit
8a673db92b
@ -45,6 +45,7 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
private final boolean direct;
|
||||
private final List<Component> components = new ArrayList<Component>();
|
||||
private final int maxNumComponents;
|
||||
private static final ByteBuffer FULL_BYTEBUFFER = (ByteBuffer) ByteBuffer.allocate(1).position(1);
|
||||
|
||||
private boolean freed;
|
||||
|
||||
@ -698,6 +699,10 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
@Override
|
||||
public CompositeByteBuf getBytes(int index, ByteBuf dst, int dstIndex, int length) {
|
||||
checkDstIndex(index, length, dstIndex, dst.capacity());
|
||||
if (length == 0) {
|
||||
return this;
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
while (length > 0) {
|
||||
Component c = components.get(i);
|
||||
@ -842,6 +847,9 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
@Override
|
||||
public CompositeByteBuf setBytes(int index, byte[] src, int srcIndex, int length) {
|
||||
checkSrcIndex(index, length, srcIndex, src.length);
|
||||
if (length == 0) {
|
||||
return this;
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
while (length > 0) {
|
||||
@ -864,6 +872,10 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
int length = src.remaining();
|
||||
|
||||
checkIndex(index, length);
|
||||
if (length == 0) {
|
||||
return this;
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
try {
|
||||
while (length > 0) {
|
||||
@ -886,6 +898,9 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
@Override
|
||||
public CompositeByteBuf setBytes(int index, ByteBuf src, int srcIndex, int length) {
|
||||
checkSrcIndex(index, length, srcIndex, src.capacity());
|
||||
if (length == 0) {
|
||||
return this;
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
while (length > 0) {
|
||||
@ -905,6 +920,9 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
@Override
|
||||
public int setBytes(int index, InputStream in, int length) throws IOException {
|
||||
checkIndex(index, length);
|
||||
if (length == 0) {
|
||||
return in.read(EmptyArrays.EMPTY_BYTES);
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
int readBytes = 0;
|
||||
@ -941,6 +959,9 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
@Override
|
||||
public int setBytes(int index, ScatteringByteChannel in, int length) throws IOException {
|
||||
checkIndex(index, length);
|
||||
if (length == 0) {
|
||||
return in.read(FULL_BYTEBUFFER);
|
||||
}
|
||||
|
||||
int i = toComponentIndex(index);
|
||||
int readBytes = 0;
|
||||
@ -982,7 +1003,9 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf {
|
||||
public ByteBuf copy(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
ByteBuf dst = Unpooled.buffer(length);
|
||||
if (length != 0) {
|
||||
copyTo(index, length, toComponentIndex(index), dst);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
@ -552,4 +552,18 @@ public abstract class AbstractCompositeByteBufTest extends AbstractByteBufTest {
|
||||
buf.removeComponent(0);
|
||||
assertEquals(0, buf.numComponents());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCopyEmpty() {
|
||||
CompositeByteBuf buf = freeLater(compositeBuffer());
|
||||
assertEquals(0, buf.numComponents());
|
||||
assertEquals(0, freeLater(buf.copy()).readableBytes());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDuplicateEmpty() {
|
||||
CompositeByteBuf buf = freeLater(compositeBuffer());
|
||||
assertEquals(0, buf.numComponents());
|
||||
assertEquals(0, freeLater(buf.duplicate()).readableBytes());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user