LibJS: Throw RangeError in StringPrototype::repeat if OOM

currently crashes with an assertion failure in `String::repeated` if
malloc can't serve a `count * input_size` sized request, so add
`String::repeated_with_error` to propagate the error.
This commit is contained in:
Jess 2024-04-18 21:35:35 +12:00 committed by Tim Flynn
parent f4c8f1a346
commit ecb7d4b40f
Notes: sideshowbarker 2024-07-18 00:34:07 +09:00
5 changed files with 16 additions and 5 deletions

View file

@ -308,13 +308,14 @@ bool String::equals_ignoring_ascii_case(StringView other) const
return StringUtils::equals_ignoring_ascii_case(bytes_as_string_view(), other);
}
String String::repeated(String const& input, size_t count)
ErrorOr<String> String::repeated(String const& input, size_t count)
{
VERIFY(!Checked<size_t>::multiplication_would_overflow(count, input.bytes().size()));
if (Checked<size_t>::multiplication_would_overflow(count, input.bytes().size()))
return Error::from_errno(EOVERFLOW);
String result;
size_t input_size = input.bytes().size();
MUST(result.replace_with_new_string(count * input_size, [&](Bytes buffer) {
TRY(result.replace_with_new_string(count * input_size, [&](Bytes buffer) {
if (input_size == 1) {
buffer.fill(input.bytes().first());
} else {
@ -323,6 +324,7 @@ String String::repeated(String const& input, size_t count)
}
return ErrorOr<void> {};
}));
return result;
}