diff --git a/compiler/src/test/scala/org/capnproto/EncodingTest.scala b/compiler/src/test/scala/org/capnproto/EncodingTest.scala index 88f766a..3a30561 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingTest.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingTest.scala @@ -379,6 +379,12 @@ class EncodingSuite extends FunSuite { } } + test("TextBuilderIntUnderflow") { + val message = new MessageBuilder(); + val root = message.initRoot(TestAnyPointer.factory); + root.getAnyPointerField.initAs(org.capnproto.Data.factory, 0); + a [DecodeException] should be thrownBy root.getAnyPointerField.getAs(org.capnproto.Text.factory); + } test("VoidListAmplification") { val builder = new MessageBuilder(); diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 25189de..e3a19a2 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -807,9 +807,13 @@ final class WireHelpers { } - //# Subtract 1 from the size for the NUL terminator. + int size = ListPointer.elementCount(resolved.ref); + if (size == 0 || + resolved.segment.buffer.get(resolved.ptr * Constants.BYTES_PER_WORD + size - 1) != 0) { + throw new DecodeException("Text blob missing NUL terminator."); + } return new Text.Builder(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD, - ListPointer.elementCount(resolved.ref) - 1); + size - 1); }