diff --git a/buffer/src/main/java/io/netty/buffer/PoolArena.java b/buffer/src/main/java/io/netty/buffer/PoolArena.java index 348b24f6c8..0a3f9f429e 100644 --- a/buffer/src/main/java/io/netty/buffer/PoolArena.java +++ b/buffer/src/main/java/io/netty/buffer/PoolArena.java @@ -233,8 +233,8 @@ abstract class PoolArena { allocate(parent.threadCache.get(), buf, newCapacity); if (newCapacity > oldCapacity) { memoryCopy( - oldMemory, oldOffset + readerIndex, - buf.memory, buf.offset + readerIndex, writerIndex - readerIndex); + oldMemory, oldOffset, + buf.memory, buf.offset, oldCapacity); } else if (newCapacity < oldCapacity) { if (readerIndex < newCapacity) { if (writerIndex > newCapacity) { diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java index 948b348f24..6661e65bc9 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledDirectByteBuf.java @@ -141,8 +141,8 @@ public class UnpooledDirectByteBuf extends AbstractReferenceCountedByteBuf { if (newCapacity > oldCapacity) { ByteBuffer oldBuffer = buffer; ByteBuffer newBuffer = ByteBuffer.allocateDirect(newCapacity); - oldBuffer.position(readerIndex).limit(writerIndex); - newBuffer.position(readerIndex).limit(writerIndex); + oldBuffer.position(0).limit(oldBuffer.capacity()); + newBuffer.position(0).limit(oldBuffer.capacity()); newBuffer.put(oldBuffer); newBuffer.clear(); setByteBuffer(newBuffer); diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java index 674a7a440c..668b794493 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledHeapByteBuf.java @@ -112,7 +112,7 @@ public class UnpooledHeapByteBuf extends AbstractReferenceCountedByteBuf { int oldCapacity = array.length; if (newCapacity > oldCapacity) { byte[] newArray = new byte[newCapacity]; - System.arraycopy(array, readerIndex(), newArray, readerIndex(), readableBytes()); + System.arraycopy(array, 0, newArray, 0, array.length); setArray(newArray); } else if (newCapacity < oldCapacity) { byte[] newArray = new byte[newCapacity]; diff --git a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java index 9d076b09e6..5373bdac21 100644 --- a/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/UnpooledUnsafeDirectByteBuf.java @@ -145,8 +145,8 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf if (newCapacity > oldCapacity) { ByteBuffer oldBuffer = buffer; ByteBuffer newBuffer = ByteBuffer.allocateDirect(newCapacity); - oldBuffer.position(readerIndex).limit(writerIndex); - newBuffer.position(readerIndex).limit(writerIndex); + oldBuffer.position(0).limit(oldBuffer.capacity()); + newBuffer.position(0).limit(oldBuffer.capacity()); newBuffer.put(oldBuffer); newBuffer.clear(); setByteBuffer(newBuffer); diff --git a/buffer/src/test/java/io/netty/buffer/DuplicateByteBufTest.java b/buffer/src/test/java/io/netty/buffer/DuplicateByteBufTest.java index 684ccbd339..ba957489be 100644 --- a/buffer/src/test/java/io/netty/buffer/DuplicateByteBufTest.java +++ b/buffer/src/test/java/io/netty/buffer/DuplicateByteBufTest.java @@ -52,4 +52,15 @@ public class DuplicateByteBufTest extends AbstractByteBufTest { super.testInternalNioBuffer(); } + // See https://github.com/netty/netty/issues/1800 + @Test + public void testIncreaseCapacityWrapped() { + ByteBuf wrapped = buffer.unwrap(); + wrapped.writeByte(0); + wrapped.readerIndex(wrapped.readerIndex() + 1); + buffer.writerIndex(buffer.writerIndex() + 1); + wrapped.capacity(wrapped.capacity() * 2); + + assertEquals((byte) 0, buffer.readByte()); + } }