From f0998737041274c821169e1d678316e3fac8d123 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Wed, 7 Sep 2011 18:12:34 +0000 Subject: [PATCH] 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 --- lib/java/src/org/apache/thrift/TBaseHelper.java | 9 +++++---- .../test/org/apache/thrift/TestTBaseHelper.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/java/src/org/apache/thrift/TBaseHelper.java b/lib/java/src/org/apache/thrift/TBaseHelper.java index 5898d5b2..eec648bc 100644 --- a/lib/java/src/org/apache/thrift/TBaseHelper.java +++ b/lib/java/src/org/apache/thrift/TBaseHelper.java @@ -224,11 +224,12 @@ public final class TBaseHelper { 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 6378524f..8b085552 100644 --- a/lib/java/test/org/apache/thrift/TestTBaseHelper.java +++ b/lib/java/test/org/apache/thrift/TestTBaseHelper.java @@ -155,6 +155,23 @@ public class TestTBaseHelper extends TestCase { 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); -- 2.17.1