diff --git a/Userland/Libraries/LibAudio/Buffer.h b/Userland/Libraries/LibAudio/Buffer.h
index 82f5a6304b..dc4f4d4e7b 100644
--- a/Userland/Libraries/LibAudio/Buffer.h
+++ b/Userland/Libraries/LibAudio/Buffer.h
@@ -181,7 +181,7 @@ public:
private:
explicit Buffer(const Vector samples)
- : m_buffer(Core::AnonymousBuffer::create_with_size(samples.size() * sizeof(Frame)))
+ : m_buffer(Core::AnonymousBuffer::create_with_size(samples.size() * sizeof(Frame)).release_value())
, m_id(allocate_id())
, m_sample_count(samples.size())
{
diff --git a/Userland/Libraries/LibCore/AnonymousBuffer.cpp b/Userland/Libraries/LibCore/AnonymousBuffer.cpp
index e019e365e5..daa89aa25a 100644
--- a/Userland/Libraries/LibCore/AnonymousBuffer.cpp
+++ b/Userland/Libraries/LibCore/AnonymousBuffer.cpp
@@ -4,10 +4,10 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include
#include
#include
#include
-#include
#include
#if defined(__serenity__)
@@ -26,40 +26,33 @@ static int memfd_create(const char* name, unsigned int flags)
namespace Core {
-AnonymousBuffer AnonymousBuffer::create_with_size(size_t size)
+ErrorOr AnonymousBuffer::create_with_size(size_t size)
{
int fd = -1;
#if defined(__serenity__)
fd = anon_create(round_up_to_power_of_two(size, PAGE_SIZE), O_CLOEXEC);
- if (fd < 0) {
- perror("anon_create");
- return {};
- }
+ if (fd < 0)
+ return AK::Error::from_errno(errno);
#elif defined(__linux__)
fd = memfd_create("", MFD_CLOEXEC);
- if (fd < 0) {
- perror("memfd_create");
- return {};
- }
+ if (fd < 0)
+ return Error::from_errno(errno);
if (ftruncate(fd, size) < 0) {
close(fd);
- perror("ftruncate");
- return {};
+ return Error::from_errno(errno);
}
#endif
if (fd < 0)
- return {};
+ return AK::Error::from_errno(errno);
return create_from_anon_fd(fd, size);
}
-RefPtr AnonymousBufferImpl::create(int fd, size_t size)
+ErrorOr> AnonymousBufferImpl::create(int fd, size_t size)
{
auto* data = mmap(nullptr, round_up_to_power_of_two(size, PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 0);
- if (data == MAP_FAILED) {
- perror("mmap");
- return {};
- }
- return adopt_ref(*new AnonymousBufferImpl(fd, size, data));
+ if (data == MAP_FAILED)
+ return AK::Error::from_errno(errno);
+ return AK::adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousBufferImpl(fd, size, data));
}
AnonymousBufferImpl::~AnonymousBufferImpl()
@@ -72,12 +65,10 @@ AnonymousBufferImpl::~AnonymousBufferImpl()
VERIFY(rc == 0);
}
-AnonymousBuffer AnonymousBuffer::create_from_anon_fd(int fd, size_t size)
+ErrorOr AnonymousBuffer::create_from_anon_fd(int fd, size_t size)
{
- auto impl = AnonymousBufferImpl::create(fd, size);
- if (!impl)
- return {};
- return AnonymousBuffer(impl.release_nonnull());
+ auto impl = TRY(AnonymousBufferImpl::create(fd, size));
+ return AnonymousBuffer(move(impl));
}
AnonymousBuffer::AnonymousBuffer(NonnullRefPtr impl)
diff --git a/Userland/Libraries/LibCore/AnonymousBuffer.h b/Userland/Libraries/LibCore/AnonymousBuffer.h
index ab4c2f9e07..5a0fd68dca 100644
--- a/Userland/Libraries/LibCore/AnonymousBuffer.h
+++ b/Userland/Libraries/LibCore/AnonymousBuffer.h
@@ -6,6 +6,7 @@
#pragma once
+#include
#include
#include
#include
@@ -16,7 +17,7 @@ namespace Core {
class AnonymousBufferImpl final : public RefCounted {
public:
- static RefPtr create(int fd, size_t);
+ static ErrorOr> create(int fd, size_t);
~AnonymousBufferImpl();
int fd() const { return m_fd; }
@@ -34,8 +35,8 @@ private:
class AnonymousBuffer {
public:
- static AnonymousBuffer create_with_size(size_t);
- static AnonymousBuffer create_from_anon_fd(int fd, size_t);
+ static ErrorOr create_with_size(size_t);
+ static ErrorOr create_from_anon_fd(int fd, size_t);
AnonymousBuffer() { }
diff --git a/Userland/Libraries/LibGUI/Clipboard.cpp b/Userland/Libraries/LibGUI/Clipboard.cpp
index 2fdc5b1e3b..09622a979e 100644
--- a/Userland/Libraries/LibGUI/Clipboard.cpp
+++ b/Userland/Libraries/LibGUI/Clipboard.cpp
@@ -106,11 +106,12 @@ RefPtr Clipboard::bitmap() const
void Clipboard::set_data(ReadonlyBytes const& data, String const& type, HashMap const& metadata)
{
- auto buffer = Core::AnonymousBuffer::create_with_size(data.size());
- if (!buffer.is_valid()) {
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(data.size());
+ if (buffer_or_error.is_error()) {
dbgln("GUI::Clipboard::set_data() failed to create a buffer");
return;
}
+ auto buffer = buffer_or_error.release_value();
if (!data.is_empty())
memcpy(buffer.data(), data.data(), data.size());
diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp
index 67a5d0dd7b..67138b90ab 100644
--- a/Userland/Libraries/LibGUI/Window.cpp
+++ b/Userland/Libraries/LibGUI/Window.cpp
@@ -862,14 +862,14 @@ OwnPtr Window::create_backing_store(const Gfx::IntSize& size
size_t pitch = Gfx::Bitmap::minimum_pitch(size.width(), format);
size_t size_in_bytes = size.height() * pitch;
- auto buffer = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(size_in_bytes, PAGE_SIZE));
- if (!buffer.is_valid()) {
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(size_in_bytes, PAGE_SIZE));
+ if (buffer_or_error.is_error()) {
perror("anon_create");
return {};
}
// FIXME: Plumb scale factor here eventually.
- auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(format, move(buffer), size, 1, {});
+ auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, 1, {});
if (!bitmap) {
VERIFY(size.width() <= INT16_MAX);
VERIFY(size.height() <= INT16_MAX);
diff --git a/Userland/Libraries/LibGfx/Bitmap.cpp b/Userland/Libraries/LibGfx/Bitmap.cpp
index 588bf36d19..fd0489c039 100644
--- a/Userland/Libraries/LibGfx/Bitmap.cpp
+++ b/Userland/Libraries/LibGfx/Bitmap.cpp
@@ -81,10 +81,10 @@ RefPtr Bitmap::try_create_shareable(BitmapFormat format, const IntSize&
const auto pitch = minimum_pitch(size.width() * scale_factor, format);
const auto data_size = size_in_bytes(pitch, size.height() * scale_factor);
- auto buffer = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(data_size, PAGE_SIZE));
- if (!buffer.is_valid())
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(data_size, PAGE_SIZE));
+ if (buffer_or_error.is_error())
return nullptr;
- return Bitmap::try_create_with_anonymous_buffer(format, buffer, size, scale_factor, {});
+ return Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, scale_factor, {});
}
Bitmap::Bitmap(BitmapFormat format, const IntSize& size, int scale_factor, const BackingStore& backing_store)
@@ -525,10 +525,10 @@ RefPtr Bitmap::to_bitmap_backed_by_anonymous_buffer() const
{
if (m_buffer.is_valid())
return *this;
- auto buffer = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(size_in_bytes(), PAGE_SIZE));
- if (!buffer.is_valid())
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(size_in_bytes(), PAGE_SIZE));
+ if (buffer_or_error.is_error())
return nullptr;
- auto bitmap = Bitmap::try_create_with_anonymous_buffer(m_format, move(buffer), size(), scale(), palette_to_vector());
+ auto bitmap = Bitmap::try_create_with_anonymous_buffer(m_format, buffer_or_error.release_value(), size(), scale(), palette_to_vector());
if (!bitmap)
return nullptr;
memcpy(bitmap->scanline(0), scanline(0), size_in_bytes());
diff --git a/Userland/Libraries/LibGfx/Palette.cpp b/Userland/Libraries/LibGfx/Palette.cpp
index 37fde562c9..c8e5e24675 100644
--- a/Userland/Libraries/LibGfx/Palette.cpp
+++ b/Userland/Libraries/LibGfx/Palette.cpp
@@ -44,7 +44,7 @@ String PaletteImpl::path(PathRole role) const
NonnullRefPtr PaletteImpl::clone() const
{
- auto new_theme_buffer = Core::AnonymousBuffer::create_with_size(m_theme_buffer.size());
+ auto new_theme_buffer = Core::AnonymousBuffer::create_with_size(m_theme_buffer.size()).release_value();
memcpy(new_theme_buffer.data(), &theme(), m_theme_buffer.size());
return adopt_ref(*new PaletteImpl(move(new_theme_buffer)));
}
diff --git a/Userland/Libraries/LibGfx/ShareableBitmap.cpp b/Userland/Libraries/LibGfx/ShareableBitmap.cpp
index b1b789b64b..35358227a7 100644
--- a/Userland/Libraries/LibGfx/ShareableBitmap.cpp
+++ b/Userland/Libraries/LibGfx/ShareableBitmap.cpp
@@ -73,10 +73,10 @@ bool decode(Decoder& decoder, Gfx::ShareableBitmap& shareable_bitmap)
if (!decoder.decode(palette))
return false;
}
- auto buffer = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), Gfx::Bitmap::size_in_bytes(Gfx::Bitmap::minimum_pitch(size.width(), bitmap_format), size.height()));
- if (!buffer.is_valid())
+ auto buffer_or_error = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), Gfx::Bitmap::size_in_bytes(Gfx::Bitmap::minimum_pitch(size.width(), bitmap_format), size.height()));
+ if (buffer_or_error.is_error())
return false;
- auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(bitmap_format, buffer, size, scale, palette);
+ auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(bitmap_format, buffer_or_error.release_value(), size, scale, palette);
if (!bitmap)
return false;
shareable_bitmap = Gfx::ShareableBitmap { bitmap.release_nonnull(), Gfx::ShareableBitmap::ConstructWithKnownGoodBitmap };
diff --git a/Userland/Libraries/LibGfx/SystemTheme.cpp b/Userland/Libraries/LibGfx/SystemTheme.cpp
index d1c7db8018..88e841c2de 100644
--- a/Userland/Libraries/LibGfx/SystemTheme.cpp
+++ b/Userland/Libraries/LibGfx/SystemTheme.cpp
@@ -29,7 +29,7 @@ void set_system_theme(Core::AnonymousBuffer buffer)
Core::AnonymousBuffer load_system_theme(Core::ConfigFile const& file)
{
- auto buffer = Core::AnonymousBuffer::create_with_size(sizeof(SystemTheme));
+ auto buffer = Core::AnonymousBuffer::create_with_size(sizeof(SystemTheme)).release_value();
auto* data = buffer.data();
diff --git a/Userland/Libraries/LibIPC/Decoder.cpp b/Userland/Libraries/LibIPC/Decoder.cpp
index 4a2093b78c..248a69cbb4 100644
--- a/Userland/Libraries/LibIPC/Decoder.cpp
+++ b/Userland/Libraries/LibIPC/Decoder.cpp
@@ -193,7 +193,10 @@ bool decode(Decoder& decoder, Core::AnonymousBuffer& buffer)
if (!decoder.decode(anon_file))
return false;
- buffer = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), size);
+ auto new_buffer_or_error = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), size);
+ if (new_buffer_or_error.is_error())
+ return false;
+ buffer = new_buffer_or_error.release_value();
return buffer.is_valid();
}
diff --git a/Userland/Libraries/LibImageDecoderClient/Client.cpp b/Userland/Libraries/LibImageDecoderClient/Client.cpp
index 97010935f2..1c7d845637 100644
--- a/Userland/Libraries/LibImageDecoderClient/Client.cpp
+++ b/Userland/Libraries/LibImageDecoderClient/Client.cpp
@@ -25,11 +25,12 @@ Optional Client::decode_image(const ReadonlyBytes& encoded_data)
if (encoded_data.is_empty())
return {};
- auto encoded_buffer = Core::AnonymousBuffer::create_with_size(encoded_data.size());
- if (!encoded_buffer.is_valid()) {
+ auto encoded_buffer_or_error = Core::AnonymousBuffer::create_with_size(encoded_data.size());
+ if (encoded_buffer_or_error.is_error()) {
dbgln("Could not allocate encoded buffer");
return {};
}
+ auto encoded_buffer = encoded_buffer_or_error.release_value();
memcpy(encoded_buffer.data(), encoded_data.data(), encoded_data.size());
auto response_or_error = try_decode_image(move(encoded_buffer));
diff --git a/Userland/Services/SpiceAgent/ClipboardServerConnection.cpp b/Userland/Services/SpiceAgent/ClipboardServerConnection.cpp
index 18a34729e6..94feabecae 100644
--- a/Userland/Services/SpiceAgent/ClipboardServerConnection.cpp
+++ b/Userland/Services/SpiceAgent/ClipboardServerConnection.cpp
@@ -62,7 +62,9 @@ void ClipboardServerConnection::set_bitmap(Gfx::Bitmap const& bitmap)
metadata.set("format", String::number((int)bitmap.format()));
metadata.set("pitch", String::number(bitmap.pitch()));
ReadonlyBytes data { bitmap.scanline(0), bitmap.size_in_bytes() };
- auto buffer = Core::AnonymousBuffer::create_with_size(bitmap.size_in_bytes());
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(bitmap.size_in_bytes());
+ VERIFY(!buffer_or_error.is_error());
+ auto buffer = buffer_or_error.release_value();
memcpy(buffer.data(), data.data(), data.size());
this->async_set_clipboard_data(buffer, "image/x-serenityos", metadata);
}
diff --git a/Userland/Services/SpiceAgent/SpiceAgent.cpp b/Userland/Services/SpiceAgent/SpiceAgent.cpp
index 5941c975f6..0e99e0447f 100644
--- a/Userland/Services/SpiceAgent/SpiceAgent.cpp
+++ b/Userland/Services/SpiceAgent/SpiceAgent.cpp
@@ -133,7 +133,9 @@ void SpiceAgent::on_message_received()
m_just_set_clip = true;
if (type == ClipboardType::Text) {
- auto anon_buffer = Core::AnonymousBuffer::create_with_size(data_buffer.size());
+ auto anon_buffer_or_error = Core::AnonymousBuffer::create_with_size(data_buffer.size());
+ VERIFY(!anon_buffer_or_error.is_error());
+ auto anon_buffer = anon_buffer_or_error.release_value();
memcpy(anon_buffer.data(), data_buffer.data(), data_buffer.size());
m_clipboard_connection.async_set_clipboard_data(anon_buffer, "text/plain", {});
return;
diff --git a/Userland/Services/WebContent/PageHost.cpp b/Userland/Services/WebContent/PageHost.cpp
index 69ccb31151..07036ac4a3 100644
--- a/Userland/Services/WebContent/PageHost.cpp
+++ b/Userland/Services/WebContent/PageHost.cpp
@@ -34,7 +34,9 @@ PageHost::~PageHost()
void PageHost::setup_palette()
{
// FIXME: Get the proper palette from our peer somehow
- auto buffer = Core::AnonymousBuffer::create_with_size(sizeof(Gfx::SystemTheme));
+ auto buffer_or_error = Core::AnonymousBuffer::create_with_size(sizeof(Gfx::SystemTheme));
+ VERIFY(!buffer_or_error.is_error());
+ auto buffer = buffer_or_error.release_value();
auto* theme = buffer.data();
theme->color[(int)Gfx::ColorRole::Window] = Color::Magenta;
theme->color[(int)Gfx::ColorRole::WindowText] = Color::Cyan;
diff --git a/Userland/Services/WindowServer/ClientConnection.cpp b/Userland/Services/WindowServer/ClientConnection.cpp
index 5599c86b4c..74d902a723 100644
--- a/Userland/Services/WindowServer/ClientConnection.cpp
+++ b/Userland/Services/WindowServer/ClientConnection.cpp
@@ -635,14 +635,14 @@ void ClientConnection::set_window_backing_store(i32 window_id, [[maybe_unused]]
window.swap_backing_stores();
} else {
// FIXME: Plumb scale factor here eventually.
- Core::AnonymousBuffer buffer = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), pitch * size.height());
- if (!buffer.is_valid()) {
+ auto buffer_or_error = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), pitch * size.height());
+ if (buffer_or_error.is_error()) {
did_misbehave("SetWindowBackingStore: Failed to create anonymous buffer for window backing store");
return;
}
auto backing_store = Gfx::Bitmap::try_create_with_anonymous_buffer(
has_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888,
- move(buffer),
+ buffer_or_error.release_value(),
size,
1,
{});