mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-04 05:20:30 +00:00
AK/ByteBuffer+Everywhere: Handle errors in ByteBuffer::slice()
This commit is contained in:
parent
c0486f93d4
commit
c10d48b72c
Notes:
sideshowbarker
2024-07-17 10:17:34 +09:00
Author: https://github.com/mjz19910 Commit: https://github.com/SerenityOS/serenity/commit/c10d48b72c Pull-request: https://github.com/SerenityOS/serenity/pull/14268 Reviewed-by: https://github.com/linusg
12 changed files with 45 additions and 34 deletions
|
@ -134,13 +134,12 @@ public:
|
|||
[[nodiscard]] void* end_pointer() { return data() + m_size; }
|
||||
[[nodiscard]] void const* end_pointer() const { return data() + m_size; }
|
||||
|
||||
// FIXME: Make this function handle failures too.
|
||||
[[nodiscard]] ByteBuffer slice(size_t offset, size_t size) const
|
||||
[[nodiscard]] ErrorOr<ByteBuffer> slice(size_t offset, size_t size) const
|
||||
{
|
||||
// I cannot hand you a slice I don't have
|
||||
VERIFY(offset + size <= this->size());
|
||||
|
||||
return copy(offset_pointer(offset), size).release_value();
|
||||
return copy(offset_pointer(offset), size);
|
||||
}
|
||||
|
||||
void clear()
|
||||
|
|
|
@ -72,9 +72,9 @@ static bool test_single(Testcase<TArg> const& testcase)
|
|||
|
||||
// Checking the results:
|
||||
bool return_ok = actual_return == testcase.expected_return;
|
||||
bool canary_1_ok = actual.slice(0, SANDBOX_CANARY_SIZE) == expected.slice(0, SANDBOX_CANARY_SIZE);
|
||||
bool main_ok = actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n) == expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n);
|
||||
bool canary_2_ok = actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE) == expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE);
|
||||
bool canary_1_ok = MUST(actual.slice(0, SANDBOX_CANARY_SIZE)) == MUST(expected.slice(0, SANDBOX_CANARY_SIZE));
|
||||
bool main_ok = MUST(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)) == MUST(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n));
|
||||
bool canary_2_ok = MUST(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)) == MUST(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE));
|
||||
bool buf_ok = actual == expected;
|
||||
|
||||
// Evaluate gravity:
|
||||
|
@ -85,20 +85,20 @@ static bool test_single(Testcase<TArg> const& testcase)
|
|||
if (!canary_1_ok) {
|
||||
warnln("Canary 1 overwritten: Expected {}\n"
|
||||
" instead got {}",
|
||||
show(expected.slice(0, SANDBOX_CANARY_SIZE)),
|
||||
show(actual.slice(0, SANDBOX_CANARY_SIZE)));
|
||||
show(MUST(expected.slice(0, SANDBOX_CANARY_SIZE))),
|
||||
show(MUST(actual.slice(0, SANDBOX_CANARY_SIZE))));
|
||||
}
|
||||
if (!main_ok) {
|
||||
warnln("Wrong output: Expected {}\n"
|
||||
" instead, got {}",
|
||||
show(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)),
|
||||
show(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)));
|
||||
show(MUST(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n))),
|
||||
show(MUST(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n))));
|
||||
}
|
||||
if (!canary_2_ok) {
|
||||
warnln("Canary 2 overwritten: Expected {}\n"
|
||||
" instead, got {}",
|
||||
show(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)),
|
||||
show(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)));
|
||||
show(MUST(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE))),
|
||||
show(MUST(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE))));
|
||||
}
|
||||
if (!return_ok) {
|
||||
warnln("Wrong return value: Expected {}, got {} instead!", testcase.expected_return, actual_return);
|
||||
|
|
|
@ -69,9 +69,9 @@ static bool test_single(Testcase const& testcase)
|
|||
|
||||
// Checking the results:
|
||||
bool return_ok = actual_return == testcase.src_n;
|
||||
bool canary_1_ok = actual.slice(0, SANDBOX_CANARY_SIZE) == expected.slice(0, SANDBOX_CANARY_SIZE);
|
||||
bool main_ok = actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n) == expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n);
|
||||
bool canary_2_ok = actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE) == expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE);
|
||||
bool canary_1_ok = MUST(actual.slice(0, SANDBOX_CANARY_SIZE)) == MUST(expected.slice(0, SANDBOX_CANARY_SIZE));
|
||||
bool main_ok = MUST(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)) == MUST(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n));
|
||||
bool canary_2_ok = MUST(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)) == MUST(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE));
|
||||
bool buf_ok = actual == expected;
|
||||
|
||||
// Evaluate gravity:
|
||||
|
@ -82,20 +82,20 @@ static bool test_single(Testcase const& testcase)
|
|||
if (!canary_1_ok) {
|
||||
warnln("Canary 1 overwritten: Expected canary {}\n"
|
||||
" instead got {}",
|
||||
show(expected.slice(0, SANDBOX_CANARY_SIZE)),
|
||||
show(actual.slice(0, SANDBOX_CANARY_SIZE)));
|
||||
show(MUST(expected.slice(0, SANDBOX_CANARY_SIZE))),
|
||||
show(MUST(actual.slice(0, SANDBOX_CANARY_SIZE))));
|
||||
}
|
||||
if (!main_ok) {
|
||||
warnln("Wrong output: Expected {}\n"
|
||||
" instead got {}",
|
||||
show(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)),
|
||||
show(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n)));
|
||||
show(MUST(expected.slice(SANDBOX_CANARY_SIZE, testcase.dest_n))),
|
||||
show(MUST(actual.slice(SANDBOX_CANARY_SIZE, testcase.dest_n))));
|
||||
}
|
||||
if (!canary_2_ok) {
|
||||
warnln("Canary 2 overwritten: Expected {}\n"
|
||||
" instead got {}",
|
||||
show(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)),
|
||||
show(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE)));
|
||||
show(MUST(expected.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE))),
|
||||
show(MUST(actual.slice(SANDBOX_CANARY_SIZE + testcase.dest_n, SANDBOX_CANARY_SIZE))));
|
||||
}
|
||||
if (!return_ok) {
|
||||
warnln("Wrong return value: Expected {}, got {} instead!", testcase.src_n, actual_return);
|
||||
|
|
|
@ -64,7 +64,8 @@ ByteBuffer Job::receive(size_t size)
|
|||
{
|
||||
ByteBuffer buffer = ByteBuffer::create_uninitialized(size).release_value_but_fixme_should_propagate_errors();
|
||||
auto nread = MUST(m_socket->read(buffer)).size();
|
||||
return buffer.slice(0, nread);
|
||||
// FIXME: Propagate errors.
|
||||
return MUST(buffer.slice(0, nread));
|
||||
}
|
||||
|
||||
bool Job::can_read() const
|
||||
|
@ -101,7 +102,8 @@ void Job::flush_received_buffers()
|
|||
continue;
|
||||
}
|
||||
VERIFY(written < payload.size());
|
||||
payload = payload.slice(written, payload.size() - written);
|
||||
// FIXME: Propagate errors.
|
||||
payload = MUST(payload.slice(written, payload.size() - written));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,7 +130,8 @@ Value ArrayBuffer::get_value(size_t byte_index, [[maybe_unused]] bool is_typed_a
|
|||
|
||||
// FIXME: Check for shared buffer
|
||||
|
||||
auto raw_value = buffer_impl().slice(byte_index, element_size);
|
||||
// FIXME: Propagate errors.
|
||||
auto raw_value = MUST(buffer_impl().slice(byte_index, element_size));
|
||||
return raw_bytes_to_numeric<T>(global_object(), move(raw_value), is_little_endian);
|
||||
}
|
||||
|
||||
|
@ -218,7 +219,8 @@ Value ArrayBuffer::get_modify_set_value(size_t byte_index, Value value, ReadWrit
|
|||
|
||||
// FIXME: Check for shared buffer
|
||||
|
||||
auto raw_bytes_read = buffer_impl().slice(byte_index, sizeof(T));
|
||||
// FIXME: Propagate errors.
|
||||
auto raw_bytes_read = MUST(buffer_impl().slice(byte_index, sizeof(T)));
|
||||
auto raw_bytes_modified = operation(raw_bytes_read, raw_bytes);
|
||||
raw_bytes_modified.span().copy_to(buffer_impl().span().slice(byte_index));
|
||||
|
||||
|
|
|
@ -246,7 +246,8 @@ static ThrowCompletionOr<Value> atomic_compare_exchange_impl(GlobalObject& globa
|
|||
// 14. Else,
|
||||
|
||||
// a. Let rawBytesRead be a List of length elementSize whose elements are the sequence of elementSize bytes starting with block[indexedPosition].
|
||||
auto raw_bytes_read = block.slice(indexed_position, sizeof(T));
|
||||
// FIXME: Propagate errors.
|
||||
auto raw_bytes_read = MUST(block.slice(indexed_position, sizeof(T)));
|
||||
|
||||
// b. If ByteListEqual(rawBytesRead, expectedBytes) is true, then
|
||||
// i. Store the individual bytes of replacementBytes into block, starting at block[indexedPosition].
|
||||
|
|
|
@ -202,7 +202,7 @@ constexpr static int USER_VALUES_OFFSET = 32;
|
|||
ErrorOr<void> Heap::read_zero_block()
|
||||
{
|
||||
auto buffer = TRY(read_block(0));
|
||||
auto file_id_buffer = buffer.slice(0, FILE_ID.length());
|
||||
auto file_id_buffer = TRY(buffer.slice(0, FILE_ID.length()));
|
||||
auto file_id = StringView(file_id_buffer);
|
||||
if (file_id != FILE_ID) {
|
||||
warnln("{}: Zero page corrupt. This is probably not a {} heap file"sv, name(), FILE_ID);
|
||||
|
|
|
@ -27,8 +27,8 @@ ErrorOr<Bytes> TLSv12::read(Bytes bytes)
|
|||
return Bytes {};
|
||||
}
|
||||
|
||||
m_context.application_buffer.span().slice(0, size_to_read).copy_to(bytes);
|
||||
m_context.application_buffer = m_context.application_buffer.slice(size_to_read, m_context.application_buffer.size() - size_to_read);
|
||||
TRY(m_context.application_buffer.slice(0, size_to_read)).span().copy_to(bytes);
|
||||
m_context.application_buffer = TRY(m_context.application_buffer.slice(size_to_read, m_context.application_buffer.size() - size_to_read));
|
||||
return Bytes { bytes.data(), size_to_read };
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,8 @@ String TLSv12::read_line(size_t max_size)
|
|||
return {};
|
||||
|
||||
String line { bit_cast<char const*>(start), offset, Chomp };
|
||||
m_context.application_buffer = m_context.application_buffer.slice(offset + 1, m_context.application_buffer.size() - offset - 1);
|
||||
// FIXME: Propagate errors.
|
||||
m_context.application_buffer = MUST(m_context.application_buffer.slice(offset + 1, m_context.application_buffer.size() - offset - 1));
|
||||
|
||||
return line;
|
||||
}
|
||||
|
|
|
@ -85,7 +85,8 @@ public:
|
|||
{
|
||||
auto length = m_current_length;
|
||||
m_current_length = 0;
|
||||
return m_packet_data.slice(0, length);
|
||||
// FIXME: Propagate errors.
|
||||
return MUST(m_packet_data.slice(0, length));
|
||||
}
|
||||
inline void set(size_t offset, u8 value)
|
||||
{
|
||||
|
|
|
@ -92,7 +92,8 @@ void TLSv12::consume(ReadonlyBytes record)
|
|||
}
|
||||
|
||||
if (index) {
|
||||
m_context.message_buffer = m_context.message_buffer.slice(index, m_context.message_buffer.size() - index);
|
||||
// FIXME: Propagate errors.
|
||||
m_context.message_buffer = MUST(m_context.message_buffer.slice(index, m_context.message_buffer.size() - index));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,10 @@ static constexpr StringView format_region = "\tBAR {}: {} region @ {:#x}";
|
|||
|
||||
static u32 read_hex_string_from_bytebuffer(ByteBuffer const& buf)
|
||||
{
|
||||
return AK::StringUtils::convert_to_uint_from_hex(String(buf.slice(2, buf.size() - 2).bytes())).release_value();
|
||||
// FIXME: Propagate errors.
|
||||
return AK::StringUtils::convert_to_uint_from_hex(
|
||||
String(MUST(buf.slice(2, buf.size() - 2)).bytes()))
|
||||
.release_value();
|
||||
}
|
||||
|
||||
static u32 convert_sysfs_value_to_uint(String const& value)
|
||||
|
|
|
@ -132,7 +132,8 @@ private:
|
|||
|
||||
if (!m_buffer.is_empty()) {
|
||||
auto size = OutputFileStream::write(m_buffer);
|
||||
m_buffer = m_buffer.slice(size, m_buffer.size() - size);
|
||||
// FIXME: Propagate errors.
|
||||
m_buffer = MUST(m_buffer.slice(size, m_buffer.size() - size));
|
||||
}
|
||||
|
||||
if (!m_buffer.is_empty())
|
||||
|
|
Loading…
Reference in a new issue