Prevent potential integer overflow in BuilderArena.allocate().
This commit is contained in:
parent
754184fd74
commit
d310db1e88
1 changed files with 8 additions and 0 deletions
|
@ -87,6 +87,10 @@ public final class BuilderArena implements Arena {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates `amount` words in an existing segment or, if no suitable segment
|
||||||
|
* exists, in a new segment.
|
||||||
|
*/
|
||||||
public AllocateResult allocate(int amount) {
|
public AllocateResult allocate(int amount) {
|
||||||
int len = this.segments.size();
|
int len = this.segments.size();
|
||||||
|
|
||||||
|
@ -97,6 +101,10 @@ public final class BuilderArena implements Arena {
|
||||||
return new AllocateResult(this.segments.get(len - 1), result);
|
return new AllocateResult(this.segments.get(len - 1), result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (amount >= 1 << 28) {
|
||||||
|
// Computing `amount * Constants.BYTES_PER_WORD` would overflow.
|
||||||
|
throw new RuntimeException("Too many words to allocate: " + amount);
|
||||||
|
}
|
||||||
SegmentBuilder newSegment = new SegmentBuilder(
|
SegmentBuilder newSegment = new SegmentBuilder(
|
||||||
this.allocator.allocateSegment(amount * Constants.BYTES_PER_WORD),
|
this.allocator.allocateSegment(amount * Constants.BYTES_PER_WORD),
|
||||||
this);
|
this);
|
||||||
|
|
Loading…
Reference in a new issue