diff --git a/java/com/google/flatbuffers/ArrayReadWriteBuf.java b/java/com/google/flatbuffers/ArrayReadWriteBuf.java index 38412e557..b7573d6e1 100644 --- a/java/com/google/flatbuffers/ArrayReadWriteBuf.java +++ b/java/com/google/flatbuffers/ArrayReadWriteBuf.java @@ -234,12 +234,18 @@ public class ArrayReadWriteBuf implements ReadWriteBuf { @Override public boolean requestCapacity(int capacity) { - if (buffer.length > capacity) { + if (capacity < 0) { + throw new IllegalArgumentException("Capacity may not be negative (likely a previous int overflow)"); + } + if (buffer.length >= capacity) { return true; } // implemented in the same growing fashion as ArrayList int oldCapacity = buffer.length; int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity < capacity) { // Note: this also catches newCapacity int overflow + newCapacity = capacity; + } buffer = Arrays.copyOf(buffer, newCapacity); return true; } diff --git a/tests/JavaTest.java b/tests/JavaTest.java index a0dead964..39c773345 100644 --- a/tests/JavaTest.java +++ b/tests/JavaTest.java @@ -1022,13 +1022,14 @@ class JavaTest { public static void testBuilderGrowth() { FlexBuffersBuilder builder = new FlexBuffersBuilder(); - builder.putString("This is a small string"); + String someString = "This is a small string"; + builder.putString(someString); ByteBuffer b = builder.finish(); - TestEq("This is a small string", FlexBuffers.getRoot(b).asString()); + TestEq(someString, FlexBuffers.getRoot(b).asString()); FlexBuffersBuilder failBuilder = new FlexBuffersBuilder(ByteBuffer.allocate(1)); try { - failBuilder.putString("This is a small string"); + failBuilder.putString(someString); // This should never be reached, it should throw an exception // since ByteBuffers do not grow assert(false); @@ -1224,4 +1225,5 @@ class JavaTest { System.exit(1); } } + }