| Index: src/zone.cc
|
| diff --git a/src/zone.cc b/src/zone.cc
|
| index 7574778f539acb9db63f73e79218a9fa0a3cd9ee..2d14d137efddf6119c8dd24daf7b5d5b4490375a 100644
|
| --- a/src/zone.cc
|
| +++ b/src/zone.cc
|
| @@ -168,7 +168,7 @@ Address Zone::NewExpand(int size) {
|
| // Make sure the requested size is already properly aligned and that
|
| // there isn't enough room in the Zone to satisfy the request.
|
| ASSERT(size == RoundDown(size, kAlignment));
|
| - ASSERT(position_ + size > limit_);
|
| + ASSERT(size > limit_ - position_);
|
|
|
| // Compute the new segment size. We use a 'high water mark'
|
| // strategy, where we increase the segment size every time we expand
|
| @@ -177,7 +177,13 @@ Address Zone::NewExpand(int size) {
|
| Segment* head = segment_head_;
|
| int old_size = (head == NULL) ? 0 : head->size();
|
| static const int kSegmentOverhead = sizeof(Segment) + kAlignment;
|
| - int new_size = kSegmentOverhead + size + (old_size << 1);
|
| + int new_size_no_overhead = size + (old_size << 1);
|
| + int new_size = kSegmentOverhead + new_size_no_overhead;
|
| + // Guard against integer overflow.
|
| + if (new_size_no_overhead < size || new_size < kSegmentOverhead) {
|
| + V8::FatalProcessOutOfMemory("Zone");
|
| + return NULL;
|
| + }
|
| if (new_size < kMinimumSegmentSize) {
|
| new_size = kMinimumSegmentSize;
|
| } else if (new_size > kMaximumSegmentSize) {
|
| @@ -196,6 +202,11 @@ Address Zone::NewExpand(int size) {
|
| // Recompute 'top' and 'limit' based on the new segment.
|
| Address result = RoundUp(segment->start(), kAlignment);
|
| position_ = result + size;
|
| + // Check for address overflow.
|
| + if (position_ < result) {
|
| + V8::FatalProcessOutOfMemory("Zone");
|
| + return NULL;
|
| + }
|
| limit_ = segment->end();
|
| ASSERT(position_ <= limit_);
|
| return result;
|
|
|