mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 03:18:11 +00:00
Everywhere: Make ByteBuffer::{create_*,copy}() OOM-safe
This commit is contained in:
parent
3a9f00c59b
commit
97e97bccab
105 changed files with 629 additions and 290 deletions
|
@ -239,7 +239,7 @@ private:
|
|||
class DHCPv4PacketBuilder {
|
||||
public:
|
||||
DHCPv4PacketBuilder()
|
||||
: m_buffer(ByteBuffer::create_zeroed(sizeof(DHCPv4Packet)))
|
||||
: m_buffer(ByteBuffer::create_zeroed(sizeof(DHCPv4Packet)).release_value()) // FIXME: Handle possible OOM failure.
|
||||
{
|
||||
auto* options = peek().options();
|
||||
// set the magic DHCP cookie value
|
||||
|
|
|
@ -69,7 +69,11 @@ OwnPtr<Request> start_request(TBadgedProtocol&& protocol, ClientConnection& clie
|
|||
request.set_method(HTTP::HttpRequest::Method::GET);
|
||||
request.set_url(url);
|
||||
request.set_headers(headers);
|
||||
request.set_body(body);
|
||||
|
||||
auto allocated_body_result = ByteBuffer::copy(body);
|
||||
if (!allocated_body_result.has_value())
|
||||
return {};
|
||||
request.set_body(allocated_body_result.release_value());
|
||||
|
||||
auto output_stream = make<OutputFileStream>(pipe_result.value().write_fd);
|
||||
output_stream->make_unbuffered();
|
||||
|
|
|
@ -38,8 +38,8 @@ RefPtr<Gfx::Bitmap> ClipboardServerConnection::get_bitmap()
|
|||
if (!format.has_value() || format.value() == 0)
|
||||
return nullptr;
|
||||
|
||||
auto data = ByteBuffer::copy(clipping.data().data<void>(), clipping.data().size());
|
||||
auto clipping_bitmap = Gfx::Bitmap::try_create_wrapper((Gfx::BitmapFormat)format.value(), { (int)width.value(), (int)height.value() }, scale.value(), pitch.value(), data.data());
|
||||
auto data = clipping.data().data<void>();
|
||||
auto clipping_bitmap = Gfx::Bitmap::try_create_wrapper((Gfx::BitmapFormat)format.value(), { (int)width.value(), (int)height.value() }, scale.value(), pitch.value(), const_cast<void*>(data));
|
||||
auto bitmap = Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, { (int)width.value(), (int)height.value() }, scale.value());
|
||||
|
||||
for (int y = 0; y < clipping_bitmap->physical_height(); ++y) {
|
||||
|
|
|
@ -59,7 +59,7 @@ void SpiceAgent::on_message_received()
|
|||
{
|
||||
ChunkHeader header {};
|
||||
read_n(&header, sizeof(header));
|
||||
auto buffer = ByteBuffer::create_uninitialized(header.size);
|
||||
auto buffer = ByteBuffer::create_uninitialized(header.size).release_value(); // FIXME: Handle possible OOM situation.
|
||||
read_n(buffer.data(), buffer.size());
|
||||
auto* message = reinterpret_cast<Message*>(buffer.data());
|
||||
switch (message->type) {
|
||||
|
@ -75,15 +75,17 @@ void SpiceAgent::on_message_received()
|
|||
auto* request_message = reinterpret_cast<ClipboardRequest*>(message->data);
|
||||
auto clipboard = m_clipboard_connection.get_clipboard_data();
|
||||
auto& mime = clipboard.mime_type();
|
||||
ByteBuffer byte_buffer;
|
||||
ByteBuffer backing_byte_buffer;
|
||||
ReadonlyBytes bytes;
|
||||
if (mime == "image/x-serenityos") {
|
||||
auto bitmap = m_clipboard_connection.get_bitmap();
|
||||
byte_buffer = Gfx::PNGWriter::encode(*bitmap);
|
||||
backing_byte_buffer = Gfx::PNGWriter::encode(*bitmap);
|
||||
bytes = backing_byte_buffer;
|
||||
} else {
|
||||
auto clip_data = clipboard.data();
|
||||
byte_buffer = ByteBuffer::copy(clip_data.data<void>(), clip_data.size());
|
||||
auto data = clipboard.data();
|
||||
bytes = { data.data<void>(), data.size() };
|
||||
}
|
||||
auto clipboard_buffer = Clipboard::make_buffer((ClipboardType)request_message->type, byte_buffer);
|
||||
auto clipboard_buffer = Clipboard::make_buffer((ClipboardType)request_message->type, bytes);
|
||||
send_message(clipboard_buffer);
|
||||
break;
|
||||
}
|
||||
|
@ -116,7 +118,7 @@ void SpiceAgent::on_message_received()
|
|||
case (u32)MessageType::Clipboard: {
|
||||
auto* clipboard_message = reinterpret_cast<Clipboard*>(message->data);
|
||||
auto type = (ClipboardType)clipboard_message->type;
|
||||
auto data_buffer = ByteBuffer::create_uninitialized(message->size - sizeof(u32));
|
||||
auto data_buffer = ByteBuffer::create_uninitialized(message->size - sizeof(u32)).release_value(); // FIXME: Handle possible OOM situation.
|
||||
|
||||
const auto total_bytes = message->size - sizeof(Clipboard);
|
||||
auto bytes_copied = header.size - sizeof(Message) - sizeof(Clipboard);
|
||||
|
@ -204,7 +206,7 @@ SpiceAgent::Message* SpiceAgent::initialize_headers(u8* data, size_t additional_
|
|||
ByteBuffer SpiceAgent::AnnounceCapabilities::make_buffer(bool request, const Vector<Capability>& capabilities)
|
||||
{
|
||||
size_t required_size = sizeof(ChunkHeader) + sizeof(Message) + sizeof(AnnounceCapabilities);
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size);
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size).release_value(); // FIXME: Handle possible OOM situation.
|
||||
u8* data = buffer.data();
|
||||
|
||||
auto* message = initialize_headers(data, sizeof(AnnounceCapabilities), MessageType::AnnounceCapabilities);
|
||||
|
@ -226,7 +228,7 @@ ByteBuffer SpiceAgent::ClipboardGrab::make_buffer(const Vector<ClipboardType>& t
|
|||
VERIFY(types.size() > 0);
|
||||
size_t variable_data_size = sizeof(u32) * types.size();
|
||||
size_t required_size = sizeof(ChunkHeader) + sizeof(Message) + variable_data_size;
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size);
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size).release_value(); // FIXME: Handle possible OOM situation.
|
||||
u8* data = buffer.data();
|
||||
|
||||
auto* message = initialize_headers(data, variable_data_size, MessageType::ClipboardGrab);
|
||||
|
@ -244,7 +246,7 @@ ByteBuffer SpiceAgent::Clipboard::make_buffer(ClipboardType type, ReadonlyBytes
|
|||
{
|
||||
size_t data_size = sizeof(Clipboard) + contents.size();
|
||||
size_t required_size = sizeof(ChunkHeader) + sizeof(Message) + data_size;
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size);
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size).release_value(); // FIXME: Handle possible OOM situation.
|
||||
u8* data = buffer.data();
|
||||
|
||||
auto* message = initialize_headers(data, data_size, MessageType::Clipboard);
|
||||
|
@ -262,7 +264,7 @@ ByteBuffer SpiceAgent::ClipboardRequest::make_buffer(ClipboardType type)
|
|||
{
|
||||
size_t data_size = sizeof(ClipboardRequest);
|
||||
size_t required_size = sizeof(ChunkHeader) + sizeof(Message) + data_size;
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size);
|
||||
auto buffer = ByteBuffer::create_uninitialized(required_size).release_value(); // FIXME: Handle possible OOM situation.
|
||||
u8* data = buffer.data();
|
||||
|
||||
auto* message = initialize_headers(data, data_size, MessageType::ClipboardRequest);
|
||||
|
|
|
@ -150,7 +150,7 @@ void Client::send_command(Command command)
|
|||
|
||||
void Client::send_commands(Vector<Command> commands)
|
||||
{
|
||||
auto buffer = ByteBuffer::create_uninitialized(commands.size() * 3);
|
||||
auto buffer = ByteBuffer::create_uninitialized(commands.size() * 3).release_value(); // FIXME: Handle possible OOM situation.
|
||||
OutputMemoryStream stream { buffer };
|
||||
|
||||
for (auto& command : commands)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue