From 3272f8902bbf1a5001606c48f333a60b324bf288 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Fri, 5 Sep 2014 11:43:46 -0400 Subject: [PATCH] fix ByteChannelMessageReader for multi-segment messages --- .../org/capnproto/ByteChannelMessageReader.java | 14 ++++++-------- .../src/main/java/org/capnproto/SegmentReader.java | 2 -- .../src/main/java/org/capnproto/WireHelpers.java | 3 +-- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/runtime/src/main/java/org/capnproto/ByteChannelMessageReader.java b/runtime/src/main/java/org/capnproto/ByteChannelMessageReader.java index 0ca0fa3..10eb9c3 100644 --- a/runtime/src/main/java/org/capnproto/ByteChannelMessageReader.java +++ b/runtime/src/main/java/org/capnproto/ByteChannelMessageReader.java @@ -62,20 +62,18 @@ public final class ByteChannelMessageReader { ByteBuffer[] segmentSlices = new ByteBuffer[segmentCount]; - segmentSlices[0] = ByteBuffer.wrap(allSegments.array(), - 0, - segment0Size * Constants.BYTES_PER_WORD); + allSegments.rewind(); + segmentSlices[0] = allSegments.slice(); + segmentSlices[0].limit(segment0Size * Constants.BYTES_PER_WORD); segmentSlices[0].order(ByteOrder.LITTLE_ENDIAN); - segmentSlices[0].mark(); int offset = segment0Size; for (int ii = 1; ii < segmentCount; ++ii) { - segmentSlices[ii] = ByteBuffer.wrap(allSegments.array(), - offset * Constants.BYTES_PER_WORD, - moreSizes.get(ii - 1) * Constants.BYTES_PER_WORD); + allSegments.position(offset * Constants.BYTES_PER_WORD); + segmentSlices[ii] = allSegments.slice(); + segmentSlices[ii].limit(moreSizes.get(ii - 1) * Constants.BYTES_PER_WORD); segmentSlices[ii].order(ByteOrder.LITTLE_ENDIAN); - segmentSlices[ii].mark(); offset += moreSizes.get(ii - 1); } diff --git a/runtime/src/main/java/org/capnproto/SegmentReader.java b/runtime/src/main/java/org/capnproto/SegmentReader.java index 0ffb294..756362d 100644 --- a/runtime/src/main/java/org/capnproto/SegmentReader.java +++ b/runtime/src/main/java/org/capnproto/SegmentReader.java @@ -4,9 +4,7 @@ import java.nio.ByteBuffer; public class SegmentReader { - // invariant: buffer's mark is at its beginning. final ByteBuffer buffer; - final Arena arena; public SegmentReader(ByteBuffer buffer, Arena arena) { diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 75bc9d8..27da268 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -337,7 +337,6 @@ final class WireHelpers { int nestingLimit) { // TODO error handling. is_null - if (nestingLimit <= 0) { throw new DecodeException("Message is too deeply nested or contains cycles."); } @@ -369,6 +368,7 @@ final class WireHelpers { int refOffset, byte expectedElementSize, int nestingLimit) { + long ref = WirePointer.get(segment.buffer, refOffset); if (WirePointer.isNull(ref)) { @@ -413,7 +413,6 @@ final class WireHelpers { //# lists can also be interpreted as struct lists. We //# need to compute the data size and pointer count for //# such structs. - int dataSize = FieldSize.dataBitsPerElement(ListPointer.elementSize(resolved.ref)); int pointerCount = FieldSize.pointersPerElement(ListPointer.elementSize(resolved.ref)); int step = dataSize + pointerCount * Constants.BITS_PER_POINTER;