THRIFT-1328. java: TBaseHelper.toString(...) appends ByteBuffer data outside of valid buffer range

This patch now correctly considers both arrayOffset and position when determining how to access the backing array of a buffer.

Patch: Andy Schlaikjer

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1166292 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/org/apache/thrift/TBaseHelper.java b/lib/java/src/org/apache/thrift/TBaseHelper.java
index 5898d5b..eec648b 100644
--- a/lib/java/src/org/apache/thrift/TBaseHelper.java
+++ b/lib/java/src/org/apache/thrift/TBaseHelper.java
@@ -224,11 +224,12 @@
     byte[] buf = bb.array();
 
     int arrayOffset = bb.arrayOffset();
-    int origLimit = bb.limit();
-    int limit = (origLimit - arrayOffset > 128) ? arrayOffset + 128 : origLimit;
+    int offset = arrayOffset + bb.position();
+    int origLimit = arrayOffset + bb.limit();
+    int limit = (origLimit - offset > 128) ? offset + 128 : origLimit;
 
-    for (int i = arrayOffset; i < limit; i++) {
-      if (i > arrayOffset) {
+    for (int i = offset; i < limit; i++) {
+      if (i > offset) {
         sb.append(" ");
       }
       sb.append(paddedByteString(buf[i]));
diff --git a/lib/java/test/org/apache/thrift/TestTBaseHelper.java b/lib/java/test/org/apache/thrift/TestTBaseHelper.java
index 6378524..8b08555 100644
--- a/lib/java/test/org/apache/thrift/TestTBaseHelper.java
+++ b/lib/java/test/org/apache/thrift/TestTBaseHelper.java
@@ -155,6 +155,23 @@
     assertNull(TBaseHelper.rightSize(null));
   }
 
+  public void testByteBufferToString() {
+    byte[] array = new byte[]{1, 2, 3};
+    ByteBuffer bb = ByteBuffer.wrap(array, 1, 2);
+    StringBuilder sb = new StringBuilder();
+    TBaseHelper.toString(bb, sb);
+    assertEquals("02 03", sb.toString());
+    bb = ByteBuffer.wrap(array, 0, array.length);
+    bb.position(1);
+    bb = bb.slice();
+    assertEquals(1, bb.arrayOffset());
+    assertEquals(0, bb.position());
+    assertEquals(2, bb.limit());
+    sb = new StringBuilder();
+    TBaseHelper.toString(bb, sb);
+    assertEquals("02 03", sb.toString());
+  }
+
   public void testCopyBinaryWithByteBuffer() throws Exception {
     byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5};
     ByteBuffer b = ByteBuffer.wrap(bytes);