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 {