diff --git a/Kernel/Bus/USB/SysFSUSB.cpp b/Kernel/Bus/USB/SysFSUSB.cpp index 3e23d7fce7..5bc16aa245 100644 --- a/Kernel/Bus/USB/SysFSUSB.cpp +++ b/Kernel/Bus/USB/SysFSUSB.cpp @@ -54,7 +54,7 @@ KResult SysFSUSBDeviceInformation::refresh_data(OpenFileDescription& description if (!cached_data) { cached_data = TRY(adopt_nonnull_own_or_enomem(new (nothrow) SysFSInodeData)); } - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); TRY(const_cast(*this).try_generate(builder)); auto& typed_cached_data = static_cast(*cached_data); typed_cached_data.buffer = builder.build(); diff --git a/Kernel/Coredump.cpp b/Kernel/Coredump.cpp index 42313a9615..7b938d97ef 100644 --- a/Kernel/Coredump.cpp +++ b/Kernel/Coredump.cpp @@ -281,7 +281,7 @@ KResult Coredump::write() SpinlockLocker lock(m_process->address_space().get_lock()); ScopedAddressSpaceSwitcher switcher(m_process); - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); TRY(create_notes_segment_data(builder)); TRY(write_elf_header()); TRY(write_program_headers(builder.bytes().size())); diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index b301745df4..a83b41d6e3 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -47,7 +47,7 @@ void Inode::sync() KResultOr> Inode::read_entire(OpenFileDescription* description) const { - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); u8 buffer[4096]; off_t offset = 0; diff --git a/Kernel/FileSystem/Plan9FileSystem.cpp b/Kernel/FileSystem/Plan9FileSystem.cpp index 0cdca6caa1..43bd3a4870 100644 --- a/Kernel/FileSystem/Plan9FileSystem.cpp +++ b/Kernel/FileSystem/Plan9FileSystem.cpp @@ -323,7 +323,7 @@ StringView Plan9FS::Message::Decoder::read_data() } Plan9FS::Message::Message(Plan9FS& fs, Type type) - : m_builder() + : m_builder(KBufferBuilder::try_create().release_value()) // FIXME: Don't assume KBufferBuilder allocation success. , m_tag(fs.allocate_tag()) , m_type(type) , m_have_been_built(false) diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index 32e086ecee..e6a034e8a6 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -480,7 +480,7 @@ KResultOr ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t co VERIFY(buffer.user_or_kernel_ptr()); if (!description) { - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); auto process = Process::from_pid(associated_pid()); if (!process) return KResult(ESRCH); @@ -579,7 +579,7 @@ KResult ProcFSProcessPropertyInode::refresh_data(OpenFileDescription& descriptio if (!cached_data) return ENOMEM; } - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); TRY(try_to_acquire_data(*process, builder)); return build_from_cached_data(builder, static_cast(*cached_data)); } diff --git a/Kernel/KBufferBuilder.cpp b/Kernel/KBufferBuilder.cpp index f7340c7d6d..a484888263 100644 --- a/Kernel/KBufferBuilder.cpp +++ b/Kernel/KBufferBuilder.cpp @@ -46,8 +46,14 @@ OwnPtr KBufferBuilder::build() return move(m_buffer); } -KBufferBuilder::KBufferBuilder() - : m_buffer(KBuffer::try_create_with_size(4 * MiB, Memory::Region::Access::ReadWrite).release_value()) +KResultOr KBufferBuilder::try_create() +{ + auto buffer = TRY(KBuffer::try_create_with_size(4 * MiB, Memory::Region::Access::ReadWrite)); + return KBufferBuilder { move(buffer) }; +} + +KBufferBuilder::KBufferBuilder(NonnullOwnPtr buffer) + : m_buffer(move(buffer)) { } diff --git a/Kernel/KBufferBuilder.h b/Kernel/KBufferBuilder.h index 07201a44bf..7874bfb31a 100644 --- a/Kernel/KBufferBuilder.h +++ b/Kernel/KBufferBuilder.h @@ -6,18 +6,22 @@ #pragma once -#include +#include #include #include namespace Kernel { class KBufferBuilder { + AK_MAKE_NONCOPYABLE(KBufferBuilder); + public: using OutputType = KBuffer; - KBufferBuilder(); + static KResultOr try_create(); + KBufferBuilder(KBufferBuilder&&) = default; + KBufferBuilder& operator=(KBufferBuilder&&) = default; ~KBufferBuilder() = default; KResult append(const StringView&); @@ -48,6 +52,8 @@ public: } private: + explicit KBufferBuilder(NonnullOwnPtr); + bool check_expand(size_t); u8* insertion_ptr() { diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index bec15840f1..a1ce03fe9d 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -575,7 +575,12 @@ bool Process::dump_perfcore() } auto& description = *description_or_error.value(); - KBufferBuilder builder; + auto builder_or_error = KBufferBuilder::try_create(); + if (builder_or_error.is_error()) { + dbgln("Failed to generate perfcore for pid {}: Could not allocate KBufferBuilder.", pid()); + return false; + } + auto builder = builder_or_error.release_value(); if (!m_perf_event_buffer->to_json(builder)) { dbgln("Failed to generate perfcore for pid {}: Could not serialize performance events to JSON.", pid().value()); return false; diff --git a/Kernel/ProcessExposed.cpp b/Kernel/ProcessExposed.cpp index 6910cf9c50..ada6ec71a9 100644 --- a/Kernel/ProcessExposed.cpp +++ b/Kernel/ProcessExposed.cpp @@ -144,7 +144,7 @@ KResult ProcFSGlobalInformation::refresh_data(OpenFileDescription& description) if (!cached_data) return ENOMEM; } - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); TRY(const_cast(*this).try_generate(builder)); auto& typed_cached_data = static_cast(*cached_data); typed_cached_data.buffer = builder.build(); @@ -157,7 +157,7 @@ KResultOr ProcFSExposedLink::read_bytes(off_t offset, size_t count, User { VERIFY(offset == 0); MutexLocker locker(m_lock); - KBufferBuilder builder; + auto builder = TRY(KBufferBuilder::try_create()); if (!const_cast(*this).acquire_link(builder)) return KResult(EFAULT); auto blob = builder.build();