diff --git a/runtime/src/main/java/org/capnproto/ListBuilder.java b/runtime/src/main/java/org/capnproto/ListBuilder.java index 9d20018..05b581c 100644 --- a/runtime/src/main/java/org/capnproto/ListBuilder.java +++ b/runtime/src/main/java/org/capnproto/ListBuilder.java @@ -99,7 +99,7 @@ public class ListBuilder extends CapTableBuilder.BuilderContext { } protected void _setBooleanElement(int index, boolean value) { - long bitOffset = index * this.step; + long bitOffset = (long) index * this.step; byte bitnum = (byte)(bitOffset % 8); int position = (int)(this.ptr + (bitOffset / 8)); byte oldValue = this.segment.buffer.get(position); diff --git a/runtime/src/test/java/org/capnproto/ListBuilderTest.java b/runtime/src/test/java/org/capnproto/ListBuilderTest.java new file mode 100644 index 0000000..d100cb5 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/ListBuilderTest.java @@ -0,0 +1,18 @@ +package org.capnproto; + +import org.junit.Test; + +import java.nio.ByteBuffer; + +public class ListBuilderTest { + + @Test(expected = IndexOutOfBoundsException.class) + public void _setBooleanElementShouldNotOverflowDuringPositionOffsetCalculation() { + ByteBuffer buffer = ByteBuffer.allocate(10); + BuilderArena builderArena = new BuilderArena(new DefaultAllocator()); + SegmentBuilder segmentBuilder = new SegmentBuilder(buffer, builderArena); + ListBuilder listBuilder = new ListBuilder(segmentBuilder, 0, 0, 2, 0, (short) 0); + + listBuilder._setBooleanElement(Integer.MAX_VALUE, true); + } +} \ No newline at end of file