From: Bryan Duxbury Date: Mon, 21 Mar 2011 18:18:33 +0000 (+0000) Subject: THRIFT-1101. java: bytebuffer length calculation in TBinaryProtocol writeBinary X-Git-Tag: 0.7.0~143 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=177b52ab58d87450042e62a9ae6e563b528ec3c5;p=common%2Fthrift.git 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 913573ba..d0d993b3 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 class TBinaryProtocol extends TProtocol { } 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 0fc3d3bc..d3b1636c 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 @@ public final class TCompactProtocol extends TProtocol { * 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 5f22cfc8..ef2a3927 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 @@ public abstract class ProtocolTestBase extends TestCase { } 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 {