BytesWritable causes OOME when array size reaches Integer.MAX_VALUE. (#393)
This commit is contained in:
parent
b214bbd2d9
commit
d60496e6c6
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user