Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 27e5a3ef3177d40e0813cd20258c5b72205e5bbb..6a2dd2b4bcb87ffc4bc7d46781645fb4f1ad6a95 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -804,7 +804,8 @@ void Heap::ScavengeExternalStringTable() { |
} |
} |
- ExternalStringTable::ShrinkNewStrings(last - start); |
+ ASSERT(last <= end); |
+ ExternalStringTable::ShrinkNewStrings(static_cast<int>(last - start)); |
} |
@@ -2018,6 +2019,9 @@ Object* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { |
Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
+ if (length < 0 || length > ByteArray::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
if (pretenure == NOT_TENURED) { |
return AllocateByteArray(length); |
} |
@@ -2034,6 +2038,9 @@ Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
Object* Heap::AllocateByteArray(int length) { |
+ if (length < 0 || length > ByteArray::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
int size = ByteArray::SizeFor(length); |
AllocationSpace space = |
(size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : NEW_SPACE; |
@@ -2636,12 +2643,16 @@ Map* Heap::SymbolMapForString(String* string) { |
Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
int chars, |
uint32_t hash_field) { |
+ ASSERT(chars >= 0); |
// Ensure the chars matches the number of characters in the buffer. |
ASSERT(static_cast<unsigned>(chars) == buffer->Length()); |
// Determine whether the string is ascii. |
bool is_ascii = true; |
- while (buffer->has_more() && is_ascii) { |
- if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) is_ascii = false; |
+ while (buffer->has_more()) { |
+ if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) { |
+ is_ascii = false; |
+ break; |
+ } |
} |
buffer->Rewind(); |
@@ -2650,9 +2661,15 @@ Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
Map* map; |
if (is_ascii) { |
+ if (chars > SeqAsciiString::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
map = ascii_symbol_map(); |
size = SeqAsciiString::SizeFor(chars); |
} else { |
+ if (chars > SeqTwoByteString::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
map = symbol_map(); |
size = SeqTwoByteString::SizeFor(chars); |
} |
@@ -2680,7 +2697,13 @@ Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
+ if (length < 0 || length > SeqAsciiString::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
+ |
int size = SeqAsciiString::SizeFor(length); |
+ ASSERT(size <= SeqAsciiString::kMaxSize); |
+ |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
AllocationSpace retry_space = OLD_DATA_SPACE; |
@@ -2708,7 +2731,11 @@ Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { |
+ if (length < 0 || length > SeqTwoByteString::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
int size = SeqTwoByteString::SizeFor(length); |
+ ASSERT(size <= SeqTwoByteString::kMaxSize); |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
AllocationSpace retry_space = OLD_DATA_SPACE; |
@@ -2747,6 +2774,9 @@ Object* Heap::AllocateEmptyFixedArray() { |
Object* Heap::AllocateRawFixedArray(int length) { |
+ if (length < 0 || length > FixedArray::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
// Use the general function if we're forced to always allocate. |
if (always_allocate()) return AllocateFixedArray(length, TENURED); |
// Allocate the raw data for a fixed array. |
@@ -2798,7 +2828,11 @@ Object* Heap::AllocateFixedArray(int length) { |
Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
+ ASSERT(length >= 0); |
ASSERT(empty_fixed_array()->IsFixedArray()); |
+ if (length < 0 || length > FixedArray::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
if (length == 0) return empty_fixed_array(); |
AllocationSpace space = |