From cd4d73e19eeabbf97a402dc0fd8d271a99424989 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 17 Jul 2021 22:07:49 +0200 Subject: [PATCH] Kernel: Add an API for turning a UserOrKernelBuffer into a KString --- Kernel/UserOrKernelBuffer.cpp | 20 ++++++++++++++++++++ Kernel/UserOrKernelBuffer.h | 1 + 2 files changed, 21 insertions(+) diff --git a/Kernel/UserOrKernelBuffer.cpp b/Kernel/UserOrKernelBuffer.cpp index d286104bd29..c4a176bda0d 100644 --- a/Kernel/UserOrKernelBuffer.cpp +++ b/Kernel/UserOrKernelBuffer.cpp @@ -29,6 +29,26 @@ String UserOrKernelBuffer::copy_into_string(size_t size) const return String(ReadonlyBytes { m_buffer, size }); } +KResultOr> UserOrKernelBuffer::try_copy_into_kstring(size_t size) const +{ + if (!m_buffer) + return EINVAL; + if (is_user_address(VirtualAddress(m_buffer))) { + char* buffer; + auto kstring = KString::try_create_uninitialized(size, buffer); + if (!kstring) + return ENOMEM; + if (!copy_from_user(buffer, m_buffer, size)) + return EFAULT; + return kstring.release_nonnull(); + } + + auto kstring = KString::try_create(ReadonlyBytes { m_buffer, size }); + if (!kstring) + return ENOMEM; + return kstring.release_nonnull(); +} + bool UserOrKernelBuffer::write(const void* src, size_t offset, size_t len) { if (!m_buffer) diff --git a/Kernel/UserOrKernelBuffer.h b/Kernel/UserOrKernelBuffer.h index 8f5a2685def..88af8b11bd2 100644 --- a/Kernel/UserOrKernelBuffer.h +++ b/Kernel/UserOrKernelBuffer.h @@ -55,6 +55,7 @@ public: } [[nodiscard]] String copy_into_string(size_t size) const; + [[nodiscard]] KResultOr> try_copy_into_kstring(size_t) const; [[nodiscard]] bool write(const void* src, size_t offset, size_t len); [[nodiscard]] bool write(const void* src, size_t len) {