| 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 =
|
|
|