BytesWritable causes OOME when array size reaches Integer.MAX_VALUE. (#393)

This commit is contained in:
Joseph Smith 2020-05-12 13:50:35 -05:00 committed by GitHub
parent b214bbd2d9
commit d60496e6c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -38,6 +38,7 @@
@InterfaceStability.Stable @InterfaceStability.Stable
public class BytesWritable extends BinaryComparable public class BytesWritable extends BinaryComparable
implements WritableComparable<BinaryComparable> { implements WritableComparable<BinaryComparable> {
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static final int LENGTH_BYTES = 4; private static final int LENGTH_BYTES = 4;
private static final byte[] EMPTY_BYTES = new byte[0]; private static final byte[] EMPTY_BYTES = new byte[0];
@ -126,7 +127,7 @@ public int getSize() {
public void setSize(int size) { public void setSize(int size) {
if (size > getCapacity()) { if (size > getCapacity()) {
// Avoid overflowing the int too early by casting to a long. // Avoid overflowing the int too early by casting to a long.
long newSize = Math.min(Integer.MAX_VALUE, (3L * size) / 2L); long newSize = Math.min(MAX_ARRAY_SIZE, (3L * size) / 2L);
setCapacity((int) newSize); setCapacity((int) newSize);
} }
this.size = size; this.size = size;