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);