THRIFT-1101. java: bytebuffer length calculation in TBinaryProtocol writeBinary
This patch fixes a bug in Binary and Compact protocol that incorrectly calculates the length of the bytes to be written when the byte buffer being written has a nonzero array offset (such as after a slice() call).
git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1083890 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java b/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
index 913573b..d0d993b 100644
--- a/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
@@ -191,7 +191,7 @@
}
public void writeBinary(ByteBuffer bin) throws TException {
- int length = bin.limit() - bin.position() - bin.arrayOffset();
+ int length = bin.limit() - bin.position();
writeI32(length);
trans_.write(bin.array(), bin.position() + bin.arrayOffset(), length);
}
diff --git a/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java b/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
index 0fc3d3b..d3b1636 100755
--- a/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
@@ -306,7 +306,7 @@
* Write a byte array, using a varint for the size.
*/
public void writeBinary(ByteBuffer bin) throws TException {
- int length = bin.limit() - bin.position() - bin.arrayOffset();
+ int length = bin.limit() - bin.position();
writeBinary(bin.array(), bin.position() + bin.arrayOffset(), length);
}
diff --git a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
index 5f22cfc..ef2a392 100644
--- a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
+++ b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
@@ -80,6 +80,17 @@
}
internalTestBinaryField(b);
}
+
+ if (canBeUsedNaked()) {
+ byte[] data = {1, 2, 3, 4, 5, 6};
+
+ TMemoryBuffer buf = new TMemoryBuffer(0);
+ TProtocol proto = getFactory().getProtocol(buf);
+ ByteBuffer bb = ByteBuffer.wrap(data);
+ bb.get();
+ proto.writeBinary(bb.slice());
+ assertEquals(ByteBuffer.wrap(data, 1, 5), proto.readBinary());
+ }
}
public void testString() throws Exception {