From 177b52ab58d87450042e62a9ae6e563b528ec3c5 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Mon, 21 Mar 2011 18:18:33 +0000 Subject: [PATCH] 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 --- .../org/apache/thrift/protocol/TBinaryProtocol.java | 2 +- .../org/apache/thrift/protocol/TCompactProtocol.java | 2 +- .../org/apache/thrift/protocol/ProtocolTestBase.java | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) 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 { -- 2.17.1