Kernel: Add an API for turning a UserOrKernelBuffer into a KString

This commit is contained in:
Andreas Kling 2021-07-17 22:07:49 +02:00
parent dd37d0a327
commit cd4d73e19e
Notes: sideshowbarker 2024-07-18 08:51:27 +09:00
2 changed files with 21 additions and 0 deletions

View File

@ -29,6 +29,26 @@ String UserOrKernelBuffer::copy_into_string(size_t size) const
return String(ReadonlyBytes { m_buffer, size });
}
KResultOr<NonnullOwnPtr<KString>> 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)

View File

@ -55,6 +55,7 @@ public:
}
[[nodiscard]] String copy_into_string(size_t size) const;
[[nodiscard]] KResultOr<NonnullOwnPtr<KString>> 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)
{