PROTON-1906: avoid potential NPE when duplicating composite buffer
(cherry picked from commit 6b7750775bf57d05f9a8f29d79e7fc3e38a8d0a1)
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
index 3780668..2c05e5f 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
@@ -66,7 +66,9 @@
private CompositeReadableBuffer(byte[] array, int offset) {
this.currentArray = array;
this.currentOffset = offset;
- this.capacity = array.length;
+ if(array != null) {
+ this.capacity = array.length;
+ }
this.limit = capacity;
}
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
index 4daef3e..2c41e7f 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
@@ -1763,6 +1763,27 @@
//----- Test various cases of Duplicate ----------------------------------//
@Test
+ public void testDuplicateOnEmptyBuffer() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+ CompositeReadableBuffer dup = buffer.duplicate();
+
+ assertNotSame(buffer, dup);
+ assertEquals(0, dup.capacity());
+ assertEquals(0, buffer.capacity());
+ assertEquals(0, dup.position());
+ assertEquals(0, buffer.position());
+ assertEquals(0, dup.limit());
+ assertEquals(0, buffer.limit());
+ assertContentEquals(buffer, dup);
+
+ try {
+ dup.reclaimRead();
+ } catch (Throwable t) {
+ fail("Compacting an empty duplicate should not fail");
+ }
+ }
+
+ @Test
public void testDuplicateWithSingleArrayContent() {
CompositeReadableBuffer buffer = new CompositeReadableBuffer();