Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index c72322ae2944a05057e225d53ee7cdc46d2bff8e..8b604aaf8c175dcebd88796d1d767e2ad6ee1eaa 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -1524,7 +1524,7 @@ class ReplacementStringBuilder { |
void IncrementCharacterCount(int by) { |
- if (character_count_ > Smi::kMaxValue - by) { |
+ if (character_count_ > String::kMaxLength - by) { |
V8::FatalProcessOutOfMemory("String.replace result too large."); |
} |
character_count_ += by; |
@@ -3384,6 +3384,7 @@ static Object* Runtime_URIEscape(Arguments args) { |
escaped_length += 3; |
} |
// We don't allow strings that are longer than a maximal length. |
+ ASSERT(String::kMaxLength < 0x7fffffff - 6); // Cannot overflow. |
if (escaped_length > String::kMaxLength) { |
Top::context()->mark_out_of_memory(); |
return Failure::OutOfMemoryException(); |
@@ -3917,11 +3918,13 @@ static inline void StringBuilderConcatHelper(String* special, |
sink + position, |
pos, |
pos + len); |
+ ASSERT(special->length() - position >= len); |
position += len; |
} else { |
String* string = String::cast(element); |
int element_length = string->length(); |
String::WriteToFlat(string, sink + position, 0, element_length); |
+ ASSERT(special->length() - position >= element_length); |
position += element_length; |
} |
} |
@@ -3960,6 +3963,7 @@ static Object* Runtime_StringBuilderConcat(Arguments args) { |
bool ascii = special->IsAsciiRepresentation(); |
int position = 0; |
+ int increment = 0; |
for (int i = 0; i < array_length; i++) { |
Object* elt = fixed_array->get(i); |
if (elt->IsSmi()) { |
@@ -3972,10 +3976,10 @@ static Object* Runtime_StringBuilderConcat(Arguments args) { |
if (pos + len > special_length) { |
return Top::Throw(Heap::illegal_argument_symbol()); |
} |
- position += len; |
+ increment = len; |
} else { |
// Position and length encoded in two smis. |
- position += (-len); |
+ increment = (-len); |
// Get the position and check that it is also a smi. |
i++; |
if (i >= array_length) { |
@@ -3989,17 +3993,18 @@ static Object* Runtime_StringBuilderConcat(Arguments args) { |
} else if (elt->IsString()) { |
String* element = String::cast(elt); |
int element_length = element->length(); |
- position += element_length; |
+ increment = element_length; |
if (ascii && !element->IsAsciiRepresentation()) { |
ascii = false; |
} |
} else { |
return Top::Throw(Heap::illegal_argument_symbol()); |
} |
- if (position > String::kMaxLength) { |
+ if (increment > String::kMaxLength - position) { |
Top::context()->mark_out_of_memory(); |
return Failure::OutOfMemoryException(); |
} |
+ position += increment; |
} |
int length = position; |