diff --git a/Kernel/Devices/HID/KeyboardDevice.cpp b/Kernel/Devices/HID/KeyboardDevice.cpp index 8e0a706d6c..0d8facdd96 100644 --- a/Kernel/Devices/HID/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/KeyboardDevice.cpp @@ -289,7 +289,7 @@ KResultOr KeyboardDevice::read(FileDescription&, u64, UserOrKernelBuffer if (m_queue.is_empty()) break; // Don't return partial data frames. - if ((size - nread) < (ssize_t)sizeof(Event)) + if (size - nread < sizeof(Event)) break; auto event = m_queue.dequeue(); diff --git a/Kernel/FileSystem/DevFS.cpp b/Kernel/FileSystem/DevFS.cpp index 9092656d07..ec80bbe59a 100644 --- a/Kernel/FileSystem/DevFS.cpp +++ b/Kernel/FileSystem/DevFS.cpp @@ -81,7 +81,7 @@ DevFSInode::DevFSInode(DevFS& fs) { } -KResultOr DevFSInode::read_bytes(off_t, ssize_t, UserOrKernelBuffer&, FileDescription*) const +KResultOr DevFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); } @@ -100,7 +100,7 @@ void DevFSInode::flush_metadata() { } -KResultOr DevFSInode::write_bytes(off_t, ssize_t, const UserOrKernelBuffer&, FileDescription*) +KResultOr DevFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*) { VERIFY_NOT_REACHED(); } @@ -152,7 +152,7 @@ DevFSLinkInode::DevFSLinkInode(DevFS& fs, String name) , m_name(name) { } -KResultOr DevFSLinkInode::read_bytes(off_t offset, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const +KResultOr DevFSLinkInode::read_bytes(off_t offset, size_t, UserOrKernelBuffer& buffer, FileDescription*) const { Locker locker(m_lock); VERIFY(offset == 0); @@ -173,7 +173,7 @@ InodeMetadata DevFSLinkInode::metadata() const metadata.mtime = mepoch; return metadata; } -KResultOr DevFSLinkInode::write_bytes(off_t offset, ssize_t count, const UserOrKernelBuffer& buffer, FileDescription*) +KResultOr DevFSLinkInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, FileDescription*) { Locker locker(m_lock); VERIFY(offset == 0); @@ -350,7 +350,7 @@ String DevFSDeviceInode::name() const return m_cached_name; } -KResultOr DevFSDeviceInode::read_bytes(off_t offset, ssize_t count, UserOrKernelBuffer& buffer, FileDescription* description) const +KResultOr DevFSDeviceInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const { Locker locker(m_lock); VERIFY(!!description); @@ -376,7 +376,7 @@ InodeMetadata DevFSDeviceInode::metadata() const metadata.minor_device = m_attached_device->minor(); return metadata; } -KResultOr DevFSDeviceInode::write_bytes(off_t offset, ssize_t count, const UserOrKernelBuffer& buffer, FileDescription* description) +KResultOr DevFSDeviceInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, FileDescription* description) { Locker locker(m_lock); VERIFY(!!description); diff --git a/Kernel/FileSystem/DevFS.h b/Kernel/FileSystem/DevFS.h index 02cf5abe37..d2f175eb05 100644 --- a/Kernel/FileSystem/DevFS.h +++ b/Kernel/FileSystem/DevFS.h @@ -57,11 +57,11 @@ public: protected: DevFSInode(DevFS&); - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; @@ -83,9 +83,9 @@ private: String determine_name() const; DevFSDeviceInode(DevFS&, const Device&); // ^Inode - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResult chown(uid_t, gid_t) override; NonnullRefPtr m_attached_device; @@ -106,9 +106,9 @@ public: protected: DevFSLinkInode(DevFS&, String); // ^Inode - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; const String m_name; String m_link; diff --git a/Kernel/FileSystem/DevPtsFS.cpp b/Kernel/FileSystem/DevPtsFS.cpp index 7d5204b880..b7d9b0a6f1 100644 --- a/Kernel/FileSystem/DevPtsFS.cpp +++ b/Kernel/FileSystem/DevPtsFS.cpp @@ -100,12 +100,12 @@ DevPtsFSInode::~DevPtsFSInode() { } -KResultOr DevPtsFSInode::read_bytes(off_t, ssize_t, UserOrKernelBuffer&, FileDescription*) const +KResultOr DevPtsFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); } -KResultOr DevPtsFSInode::write_bytes(off_t, ssize_t, const UserOrKernelBuffer&, FileDescription*) +KResultOr DevPtsFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*) { VERIFY_NOT_REACHED(); } diff --git a/Kernel/FileSystem/DevPtsFS.h b/Kernel/FileSystem/DevPtsFS.h index 891bbf2ea2..91437514fd 100644 --- a/Kernel/FileSystem/DevPtsFS.h +++ b/Kernel/FileSystem/DevPtsFS.h @@ -47,12 +47,12 @@ private: DevPtsFSInode(DevPtsFS&, InodeIndex, SlavePTY*); // ^Inode - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 6ef1eebe37..7b1977ba77 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -21,7 +21,7 @@ namespace Kernel { static constexpr size_t max_block_size = 4096; -static constexpr ssize_t max_inline_symlink_length = 60; +static constexpr size_t max_inline_symlink_length = 60; struct Ext2FSDirectoryEntry { String name; @@ -823,7 +823,7 @@ RefPtr Ext2FS::get_inode(InodeIdentifier inode) const return new_inode; } -KResultOr Ext2FSInode::read_bytes(off_t offset, ssize_t count, UserOrKernelBuffer& buffer, FileDescription* description) const +KResultOr Ext2FSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const { Locker inode_locker(m_lock); VERIFY(offset >= 0); @@ -837,7 +837,7 @@ KResultOr Ext2FSInode::read_bytes(off_t offset, ssize_t count, UserOrKe // This avoids wasting an entire block on short links. (Most links are short.) if (is_symlink() && size() < max_inline_symlink_length) { VERIFY(offset == 0); - ssize_t nread = min((off_t)size() - offset, static_cast(count)); + size_t nread = min((off_t)size() - offset, static_cast(count)); if (!buffer.write(((const u8*)m_raw_inode.i_block) + offset, (size_t)nread)) return EFAULT; return nread; @@ -862,7 +862,7 @@ KResultOr Ext2FSInode::read_bytes(off_t offset, ssize_t count, UserOrKe int offset_into_first_block = offset % block_size; - ssize_t nread = 0; + size_t nread = 0; auto remaining_count = min((off_t)count, (off_t)size() - offset); dbgln_if(EXT2_VERY_DEBUG, "Ext2FSInode[{}]::read_bytes(): Reading up to {} bytes, {} bytes into inode to {}", identifier(), count, offset, buffer.user_or_kernel_ptr()); @@ -968,10 +968,9 @@ KResult Ext2FSInode::resize(u64 new_size) return KSuccess; } -KResultOr Ext2FSInode::write_bytes(off_t offset, ssize_t count, const UserOrKernelBuffer& data, FileDescription* description) +KResultOr Ext2FSInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& data, FileDescription* description) { VERIFY(offset >= 0); - VERIFY(count >= 0); if (count == 0) return 0; @@ -1017,7 +1016,7 @@ KResultOr Ext2FSInode::write_bytes(off_t offset, ssize_t count, const U size_t offset_into_first_block = offset % block_size; - ssize_t nwritten = 0; + size_t nwritten = 0; auto remaining_count = min((off_t)count, (off_t)new_size - offset); dbgln_if(EXT2_VERY_DEBUG, "Ext2FSInode[{}]::write_bytes(): Writing {} bytes, {} bytes into inode from {}", identifier(), count, offset, data.user_or_kernel_ptr()); diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index 6027e28a12..738b506e30 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -38,12 +38,12 @@ public: private: // ^Inode - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& data, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode& child, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; diff --git a/Kernel/FileSystem/FileDescription.cpp b/Kernel/FileSystem/FileDescription.cpp index 565b19d54a..76e1a3cd62 100644 --- a/Kernel/FileSystem/FileDescription.cpp +++ b/Kernel/FileSystem/FileDescription.cpp @@ -203,7 +203,7 @@ KResultOr> FileDescription::read_entire_file() return m_inode->read_entire(this); } -KResultOr FileDescription::get_dir_entries(UserOrKernelBuffer& output_buffer, ssize_t size) +KResultOr FileDescription::get_dir_entries(UserOrKernelBuffer& output_buffer, size_t size) { Locker locker(m_lock, Lock::Mode::Shared); if (!is_directory()) @@ -213,9 +213,6 @@ KResultOr FileDescription::get_dir_entries(UserOrKernelBuffer& output_b if (!metadata.is_valid()) return EIO; - if (size < 0) - return EINVAL; - size_t remaining = size; KResult error = KSuccess; u8 stack_buffer[PAGE_SIZE]; diff --git a/Kernel/FileSystem/FileDescription.h b/Kernel/FileSystem/FileDescription.h index 8be270218d..20c678dfaf 100644 --- a/Kernel/FileSystem/FileDescription.h +++ b/Kernel/FileSystem/FileDescription.h @@ -56,7 +56,7 @@ public: bool can_read() const; bool can_write() const; - KResultOr get_dir_entries(UserOrKernelBuffer& buffer, ssize_t); + KResultOr get_dir_entries(UserOrKernelBuffer& buffer, size_t); KResultOr> read_entire_file(); diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index a5f058f069..f7283fa5b8 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -51,7 +51,7 @@ KResultOr> Inode::read_entire(FileDescription* descriptio { KBufferBuilder builder; - ssize_t nread; + size_t nread; u8 buffer[4096]; off_t offset = 0; for (;;) { @@ -60,18 +60,14 @@ KResultOr> Inode::read_entire(FileDescription* descriptio if (result.is_error()) return result.error(); nread = result.value(); - VERIFY(nread <= (ssize_t)sizeof(buffer)); + VERIFY(nread <= sizeof(buffer)); if (nread <= 0) break; builder.append((const char*)buffer, nread); offset += nread; - if (nread < (ssize_t)sizeof(buffer)) + if (nread < sizeof(buffer)) break; } - if (nread < 0) { - dmesgln("Inode::read_entire: Error: {}", nread); - return KResult((ErrnoCode)-nread); - } auto entire_file = builder.build(); if (!entire_file) diff --git a/Kernel/FileSystem/Inode.h b/Kernel/FileSystem/Inode.h index ed96e9be9e..46e44aefae 100644 --- a/Kernel/FileSystem/Inode.h +++ b/Kernel/FileSystem/Inode.h @@ -52,10 +52,10 @@ public: virtual KResult attach(FileDescription&) { return KSuccess; } virtual void detach(FileDescription&) { } virtual void did_seek(FileDescription&, off_t) { } - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const = 0; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const = 0; virtual KResult traverse_as_directory(Function) const = 0; virtual RefPtr lookup(StringView name) = 0; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& data, FileDescription*) = 0; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) = 0; virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0; virtual KResult remove_child(const StringView& name) = 0; diff --git a/Kernel/FileSystem/Plan9FileSystem.cpp b/Kernel/FileSystem/Plan9FileSystem.cpp index 56bae74845..aa8bb7df95 100644 --- a/Kernel/FileSystem/Plan9FileSystem.cpp +++ b/Kernel/FileSystem/Plan9FileSystem.cpp @@ -171,7 +171,7 @@ public: const KBuffer& build(); - static constexpr ssize_t max_header_size = 24; + static constexpr size_t max_header_size = 24; private: template @@ -634,9 +634,9 @@ KResult Plan9FS::post_message_and_wait_for_a_reply(Message& message) } } -ssize_t Plan9FS::adjust_buffer_size(ssize_t size) const +size_t Plan9FS::adjust_buffer_size(size_t size) const { - ssize_t max_size = m_max_message_size - Message::max_header_size; + size_t max_size = m_max_message_size - Message::max_header_size; return min(size, max_size); } @@ -728,7 +728,7 @@ KResult Plan9FSInode::ensure_open_for_mode(int mode) } } -KResultOr Plan9FSInode::read_bytes(off_t offset, ssize_t size, UserOrKernelBuffer& buffer, FileDescription*) const +KResultOr Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const { auto result = const_cast(*this).ensure_open_for_mode(O_RDONLY); if (result.is_error()) @@ -767,7 +767,7 @@ KResultOr Plan9FSInode::read_bytes(off_t offset, ssize_t size, UserOrKe return nread; } -KResultOr Plan9FSInode::write_bytes(off_t offset, ssize_t size, const UserOrKernelBuffer& data, FileDescription*) +KResultOr Plan9FSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& data, FileDescription*) { auto result = ensure_open_for_mode(O_WRONLY); if (result.is_error()) diff --git a/Kernel/FileSystem/Plan9FileSystem.h b/Kernel/FileSystem/Plan9FileSystem.h index dd654e668b..3a388d451d 100644 --- a/Kernel/FileSystem/Plan9FileSystem.h +++ b/Kernel/FileSystem/Plan9FileSystem.h @@ -123,7 +123,7 @@ private: KResult post_message_and_explicitly_ignore_reply(Message&); ProtocolVersion parse_protocol_version(const StringView&) const; - ssize_t adjust_buffer_size(ssize_t size) const; + size_t adjust_buffer_size(size_t size) const; void thread_main(); void ensure_thread(); @@ -156,8 +156,8 @@ public: // ^Inode virtual InodeMetadata metadata() const override; virtual void flush_metadata() override; - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& data, FileDescription*) override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index 10adb72459..977162e6bc 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -895,7 +895,7 @@ static bool read_sys_bool(InodeIdentifier inode_id, KBufferBuilder& builder) return true; } -static ssize_t write_sys_bool(InodeIdentifier inode_id, const UserOrKernelBuffer& buffer, size_t size) +static KResultOr write_sys_bool(InodeIdentifier inode_id, const UserOrKernelBuffer& buffer, size_t size) { auto& variable = SysVariable::for_inode(inode_id); VERIFY(variable.type == SysVariable::Type::Boolean); @@ -913,7 +913,7 @@ static ssize_t write_sys_bool(InodeIdentifier inode_id, const UserOrKernelBuffer return result.error(); VERIFY(result.value() == 0 || (result.value() == 1 && did_read)); if (result.value() == 0 || !(value == '0' || value == '1')) - return (ssize_t)size; + return size; auto* lockable_bool = reinterpret_cast*>(variable.address); { @@ -921,7 +921,7 @@ static ssize_t write_sys_bool(InodeIdentifier inode_id, const UserOrKernelBuffer lockable_bool->resource() = value == '1'; } variable.notify(); - return (ssize_t)size; + return size; } static bool read_sys_string(InodeIdentifier inode_id, KBufferBuilder& builder) @@ -935,14 +935,14 @@ static bool read_sys_string(InodeIdentifier inode_id, KBufferBuilder& builder) return true; } -static ssize_t write_sys_string(InodeIdentifier inode_id, const UserOrKernelBuffer& buffer, size_t size) +static KResultOr write_sys_string(InodeIdentifier inode_id, const UserOrKernelBuffer& buffer, size_t size) { auto& variable = SysVariable::for_inode(inode_id); VERIFY(variable.type == SysVariable::Type::String); auto string_copy = buffer.copy_into_string(size); if (string_copy.is_null()) - return -EFAULT; + return EFAULT; { auto* lockable_string = reinterpret_cast*>(variable.address); @@ -950,7 +950,7 @@ static ssize_t write_sys_string(InodeIdentifier inode_id, const UserOrKernelBuff lockable_string->resource() = move(string_copy); } variable.notify(); - return (ssize_t)size; + return size; } void ProcFS::add_sys_bool(String&& name, Lockable& var, Function&& notify_callback) @@ -1223,7 +1223,7 @@ InodeMetadata ProcFSInode::metadata() const return metadata; } -KResultOr ProcFSInode::read_bytes(off_t offset, ssize_t count, UserOrKernelBuffer& buffer, FileDescription* description) const +KResultOr ProcFSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const { dbgln_if(PROCFS_DEBUG, "ProcFS: read_bytes offset: {} count: {}", offset, count); VERIFY(offset >= 0); @@ -1242,7 +1242,7 @@ KResultOr ProcFSInode::read_bytes(off_t offset, ssize_t count, UserOrKe if (!data_buffer || (size_t)offset >= data_buffer->size()) return 0; - ssize_t nread = min(static_cast(data_buffer->size() - offset), static_cast(count)); + size_t nread = min(static_cast(data_buffer->size() - offset), static_cast(count)); if (!buffer.write(data_buffer->data() + offset, nread)) return EFAULT; @@ -1454,7 +1454,7 @@ void ProcFSInode::flush_metadata() { } -KResultOr ProcFSInode::write_bytes(off_t offset, ssize_t size, const UserOrKernelBuffer& buffer, FileDescription*) +KResultOr ProcFSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& buffer, FileDescription*) { // For process-specific inodes, hold the process's ptrace lock across the write // and refuse to write at all data if the process is not dumpable. @@ -1478,7 +1478,7 @@ KResultOr ProcFSInode::write_bytes(off_t offset, ssize_t size, const Us auto* directory_entry = fs().get_directory_entry(identifier()); - ssize_t (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t) = nullptr; + KResultOr (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t) = nullptr; if (directory_entry == nullptr) { if (to_proc_parent_directory(identifier()) == PDI_Root_sys) { @@ -1503,10 +1503,10 @@ KResultOr ProcFSInode::write_bytes(off_t offset, ssize_t size, const Us VERIFY(is_persistent_inode(identifier())); // FIXME: Being able to write into ProcFS at a non-zero offset seems like something we should maybe support.. VERIFY(offset == 0); - ssize_t nwritten = write_callback(identifier(), buffer, (size_t)size); - if (nwritten < 0) - dbgln("ProcFS: Writing {} bytes failed: {}", size, nwritten); - return nwritten; + auto nwritten_or_error = write_callback(identifier(), buffer, (size_t)size); + if (nwritten_or_error.is_error()) + dbgln("ProcFS: Writing {} bytes failed: {}", size, nwritten_or_error.error()); + return nwritten_or_error; } KResultOr> ProcFSInode::resolve_as_link(Custody& base, RefPtr* out_parent, int options, int symlink_recursion_level) const diff --git a/Kernel/FileSystem/ProcFS.h b/Kernel/FileSystem/ProcFS.h index 4c34709811..a93b8c5414 100644 --- a/Kernel/FileSystem/ProcFS.h +++ b/Kernel/FileSystem/ProcFS.h @@ -38,7 +38,7 @@ private: struct ProcFSDirectoryEntry { ProcFSDirectoryEntry() = default; - ProcFSDirectoryEntry(const char* a_name, unsigned a_proc_file_type, bool a_supervisor_only, bool (*read_callback)(InodeIdentifier, KBufferBuilder&) = nullptr, ssize_t (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t) = nullptr, RefPtr&& a_inode = nullptr) + ProcFSDirectoryEntry(const char* a_name, unsigned a_proc_file_type, bool a_supervisor_only, bool (*read_callback)(InodeIdentifier, KBufferBuilder&) = nullptr, KResultOr (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t) = nullptr, RefPtr&& a_inode = nullptr) : name(a_name) , proc_file_type(a_proc_file_type) , supervisor_only(a_supervisor_only) @@ -52,7 +52,7 @@ private: unsigned proc_file_type { 0 }; bool supervisor_only { false }; bool (*read_callback)(InodeIdentifier, KBufferBuilder&); - ssize_t (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t); + KResultOr (*write_callback)(InodeIdentifier, const UserOrKernelBuffer&, size_t); RefPtr inode; InodeIdentifier identifier(unsigned fsid) const; }; @@ -77,12 +77,12 @@ private: // ^Inode virtual KResult attach(FileDescription&) override; virtual void did_seek(FileDescription&, off_t) override; - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; @@ -111,12 +111,12 @@ private: // ^Inode virtual KResult attach(FileDescription&) override; virtual void did_seek(FileDescription&, off_t) override; - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer&, FileDescription*) const override { VERIFY_NOT_REACHED(); } + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const override { VERIFY_NOT_REACHED(); } virtual InodeMetadata metadata() const override; virtual KResult traverse_as_directory(Function) const override { VERIFY_NOT_REACHED(); } virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override {}; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer&, FileDescription*) override { VERIFY_NOT_REACHED(); } + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*) override { VERIFY_NOT_REACHED(); } virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; diff --git a/Kernel/FileSystem/TmpFS.cpp b/Kernel/FileSystem/TmpFS.cpp index 08cfb261bc..64e97005fd 100644 --- a/Kernel/FileSystem/TmpFS.cpp +++ b/Kernel/FileSystem/TmpFS.cpp @@ -127,11 +127,10 @@ KResult TmpFSInode::traverse_as_directory(Function TmpFSInode::read_bytes(off_t offset, ssize_t size, UserOrKernelBuffer& buffer, FileDescription*) const +KResultOr TmpFSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const { Locker locker(m_lock, Lock::Mode::Shared); VERIFY(!is_directory()); - VERIFY(size >= 0); VERIFY(offset >= 0); if (!m_content) @@ -148,7 +147,7 @@ KResultOr TmpFSInode::read_bytes(off_t offset, ssize_t size, UserOrKern return size; } -KResultOr TmpFSInode::write_bytes(off_t offset, ssize_t size, const UserOrKernelBuffer& buffer, FileDescription*) +KResultOr TmpFSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& buffer, FileDescription*) { Locker locker(m_lock); VERIFY(!is_directory()); diff --git a/Kernel/FileSystem/TmpFS.h b/Kernel/FileSystem/TmpFS.h index 823a21c33c..ec3431b0be 100644 --- a/Kernel/FileSystem/TmpFS.h +++ b/Kernel/FileSystem/TmpFS.h @@ -54,12 +54,12 @@ public: const TmpFS& fs() const { return static_cast(Inode::fs()); } // ^Inode - virtual KResultOr read_bytes(off_t, ssize_t, UserOrKernelBuffer& buffer, FileDescription*) const override; + virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; virtual KResult traverse_as_directory(Function) const override; virtual RefPtr lookup(StringView name) override; virtual void flush_metadata() override; - virtual KResultOr write_bytes(off_t, ssize_t, const UserOrKernelBuffer& buffer, FileDescription*) override; + virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override; virtual KResultOr> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override; virtual KResult add_child(Inode&, const StringView& name, mode_t) override; virtual KResult remove_child(const StringView& name) override; diff --git a/Kernel/Heap/SlabAllocator.cpp b/Kernel/Heap/SlabAllocator.cpp index cad5a9f87c..d5980ad2aa 100644 --- a/Kernel/Heap/SlabAllocator.cpp +++ b/Kernel/Heap/SlabAllocator.cpp @@ -97,7 +97,7 @@ private: }; Atomic m_freelist { nullptr }; - Atomic m_num_allocated; + Atomic m_num_allocated; size_t m_slab_count; void* m_base { nullptr }; void* m_end { nullptr }; diff --git a/Kernel/Process.h b/Kernel/Process.h index 8a5c727aed..cd18698ea9 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -270,7 +270,7 @@ public: KResultOr sys$inode_watcher_add_watch(Userspace user_params); KResultOr sys$inode_watcher_remove_watch(int fd, int wd); KResultOr sys$dbgputch(u8); - KResultOr sys$dbgputstr(Userspace, int length); + KResultOr sys$dbgputstr(Userspace, size_t); KResultOr sys$dump_backtrace(); KResultOr sys$gettid(); KResultOr sys$donate(pid_t tid); @@ -290,10 +290,10 @@ public: KResultOr sys$umask(mode_t); KResultOr sys$open(Userspace); KResultOr sys$close(int fd); - KResultOr sys$read(int fd, Userspace, ssize_t); - KResultOr sys$readv(int fd, Userspace iov, int iov_count); - KResultOr sys$write(int fd, Userspace, ssize_t); - KResultOr sys$writev(int fd, Userspace iov, int iov_count); + KResultOr sys$read(int fd, Userspace, size_t); + KResultOr sys$readv(int fd, Userspace iov, int iov_count); + KResultOr sys$write(int fd, Userspace, size_t); + KResultOr sys$writev(int fd, Userspace iov, int iov_count); KResultOr sys$fstat(int fd, Userspace); KResultOr sys$stat(Userspace); KResultOr sys$lseek(int fd, Userspace, int whence); @@ -312,7 +312,7 @@ public: KResultOr sys$purge(int mode); KResultOr sys$select(Userspace); KResultOr sys$poll(Userspace); - KResultOr sys$get_dir_entries(int fd, Userspace, ssize_t); + KResultOr sys$get_dir_entries(int fd, Userspace, size_t); KResultOr sys$getcwd(Userspace, size_t); KResultOr sys$chdir(Userspace, size_t); KResultOr sys$fchdir(int fd); @@ -321,8 +321,8 @@ public: KResultOr sys$clock_gettime(clockid_t, Userspace); KResultOr sys$clock_settime(clockid_t, Userspace); KResultOr sys$clock_nanosleep(Userspace); - KResultOr sys$gethostname(Userspace, ssize_t); - KResultOr sys$sethostname(Userspace, ssize_t); + KResultOr sys$gethostname(Userspace, size_t); + KResultOr sys$sethostname(Userspace, size_t); KResultOr sys$uname(Userspace); KResultOr sys$readlink(Userspace); KResultOr sys$ttyname(int fd, Userspace, size_t); @@ -333,8 +333,8 @@ public: KResultOr sys$sigaction(int signum, Userspace act, Userspace old_act); KResultOr sys$sigprocmask(int how, Userspace set, Userspace old_set); KResultOr sys$sigpending(Userspace); - KResultOr sys$getgroups(ssize_t, Userspace); - KResultOr sys$setgroups(ssize_t, Userspace); + KResultOr sys$getgroups(size_t, Userspace); + KResultOr sys$setgroups(size_t, Userspace); KResultOr sys$pipe(int pipefd[2], int flags); KResultOr sys$killpg(pid_t pgrp, int sig); KResultOr sys$seteuid(uid_t); @@ -367,8 +367,8 @@ public: KResultOr sys$accept4(Userspace); KResultOr sys$connect(int sockfd, Userspace, socklen_t); KResultOr sys$shutdown(int sockfd, int how); - KResultOr sys$sendmsg(int sockfd, Userspace, int flags); - KResultOr sys$recvmsg(int sockfd, Userspace, int flags); + KResultOr sys$sendmsg(int sockfd, Userspace, int flags); + KResultOr sys$recvmsg(int sockfd, Userspace, int flags); KResultOr sys$getsockopt(Userspace); KResultOr sys$setsockopt(Userspace); KResultOr sys$getsockname(Userspace); @@ -529,7 +529,7 @@ private: void delete_perf_events_buffer(); KResult do_exec(NonnullRefPtr main_program_description, Vector arguments, Vector environment, RefPtr interpreter_description, Thread*& new_main_thread, u32& prev_flags, const Elf32_Ehdr& main_program_header); - KResultOr do_write(FileDescription&, const UserOrKernelBuffer&, size_t); + KResultOr do_write(FileDescription&, const UserOrKernelBuffer&, size_t); KResultOr do_statvfs(String path, statvfs* buf); diff --git a/Kernel/Storage/StorageDevice.cpp b/Kernel/Storage/StorageDevice.cpp index 0d904105f5..ab526deb19 100644 --- a/Kernel/Storage/StorageDevice.cpp +++ b/Kernel/Storage/StorageDevice.cpp @@ -41,7 +41,7 @@ KResultOr StorageDevice::read(FileDescription&, u64 offset, UserOrKernel { unsigned index = offset / block_size(); u16 whole_blocks = len / block_size(); - ssize_t remaining = len % block_size(); + size_t remaining = len % block_size(); unsigned blocks_per_page = PAGE_SIZE / block_size(); @@ -106,7 +106,7 @@ KResultOr StorageDevice::write(FileDescription&, u64 offset, const UserO { unsigned index = offset / block_size(); u16 whole_blocks = len / block_size(); - ssize_t remaining = len % block_size(); + size_t remaining = len % block_size(); unsigned blocks_per_page = PAGE_SIZE / block_size(); diff --git a/Kernel/Syscalls/anon_create.cpp b/Kernel/Syscalls/anon_create.cpp index cb30655806..8f8aa413e1 100644 --- a/Kernel/Syscalls/anon_create.cpp +++ b/Kernel/Syscalls/anon_create.cpp @@ -21,6 +21,9 @@ KResultOr Process::sys$anon_create(size_t size, int options) if (size % PAGE_SIZE) return EINVAL; + if (size > NumericLimits::max()) + return EINVAL; + int new_fd = alloc_fd(); if (new_fd < 0) return new_fd; diff --git a/Kernel/Syscalls/chdir.cpp b/Kernel/Syscalls/chdir.cpp index c0aff80211..bded5a93fb 100644 --- a/Kernel/Syscalls/chdir.cpp +++ b/Kernel/Syscalls/chdir.cpp @@ -45,6 +45,9 @@ KResultOr Process::sys$getcwd(Userspace buffer, size_t size) { REQUIRE_PROMISE(rpath); + if (size > NumericLimits::max()) + return EINVAL; + auto path = current_directory().absolute_path(); size_t ideal_size = path.length() + 1; diff --git a/Kernel/Syscalls/debug.cpp b/Kernel/Syscalls/debug.cpp index 7f864e5da2..c3f4872a36 100644 --- a/Kernel/Syscalls/debug.cpp +++ b/Kernel/Syscalls/debug.cpp @@ -23,15 +23,18 @@ KResultOr Process::sys$dbgputch(u8 ch) return 0; } -KResultOr Process::sys$dbgputstr(Userspace characters, int length) +KResultOr Process::sys$dbgputstr(Userspace characters, size_t size) { - if (length <= 0) + if (size <= 0) return 0; - auto buffer = UserOrKernelBuffer::for_user_buffer(characters, length); + if (size > NumericLimits::max()) + return EINVAL; + + auto buffer = UserOrKernelBuffer::for_user_buffer(characters, size); if (!buffer.has_value()) return EFAULT; - return buffer.value().read_buffered<1024>(length, [&](u8 const* buffer, size_t buffer_size) { + return buffer.value().read_buffered<1024>(size, [&](u8 const* buffer, size_t buffer_size) { for (size_t i = 0; i < buffer_size; ++i) IO::out8(IO::BOCHS_DEBUG_PORT, buffer[i]); return buffer_size; diff --git a/Kernel/Syscalls/get_dir_entries.cpp b/Kernel/Syscalls/get_dir_entries.cpp index 8219cfdecc..b449e88dcd 100644 --- a/Kernel/Syscalls/get_dir_entries.cpp +++ b/Kernel/Syscalls/get_dir_entries.cpp @@ -9,10 +9,10 @@ namespace Kernel { -KResultOr Process::sys$get_dir_entries(int fd, Userspace user_buffer, ssize_t user_size) +KResultOr Process::sys$get_dir_entries(int fd, Userspace user_buffer, size_t user_size) { REQUIRE_PROMISE(stdio); - if (user_size < 0) + if (user_size > NumericLimits::max()) return EINVAL; auto description = file_description(fd); if (!description) diff --git a/Kernel/Syscalls/getrandom.cpp b/Kernel/Syscalls/getrandom.cpp index 8000b25ef2..c92cc5778e 100644 --- a/Kernel/Syscalls/getrandom.cpp +++ b/Kernel/Syscalls/getrandom.cpp @@ -16,7 +16,7 @@ namespace Kernel { KResultOr Process::sys$getrandom(Userspace buffer, size_t buffer_size, [[maybe_unused]] unsigned flags) { REQUIRE_PROMISE(stdio); - if (buffer_size <= 0) + if (buffer_size > NumericLimits::max()) return EINVAL; auto data_buffer = UserOrKernelBuffer::for_user_buffer(buffer, buffer_size); diff --git a/Kernel/Syscalls/getuid.cpp b/Kernel/Syscalls/getuid.cpp index 48d61d0274..349b0f651d 100644 --- a/Kernel/Syscalls/getuid.cpp +++ b/Kernel/Syscalls/getuid.cpp @@ -48,14 +48,12 @@ KResultOr Process::sys$getresgid(Userspace rgid, Userspace return 0; } -KResultOr Process::sys$getgroups(ssize_t count, Userspace user_gids) +KResultOr Process::sys$getgroups(size_t count, Userspace user_gids) { REQUIRE_PROMISE(stdio); - if (count < 0) - return EINVAL; if (!count) return extra_gids().size(); - if (count != (int)extra_gids().size()) + if (count != extra_gids().size()) return EINVAL; if (!copy_to_user(user_gids, extra_gids().data(), sizeof(gid_t) * count)) diff --git a/Kernel/Syscalls/hostname.cpp b/Kernel/Syscalls/hostname.cpp index cc3b4b7f48..b5e08f098f 100644 --- a/Kernel/Syscalls/hostname.cpp +++ b/Kernel/Syscalls/hostname.cpp @@ -11,10 +11,10 @@ namespace Kernel { extern String* g_hostname; extern Lock* g_hostname_lock; -KResultOr Process::sys$gethostname(Userspace buffer, ssize_t size) +KResultOr Process::sys$gethostname(Userspace buffer, size_t size) { REQUIRE_PROMISE(stdio); - if (size < 0) + if (size > NumericLimits::max()) return EINVAL; Locker locker(*g_hostname_lock, Lock::Mode::Shared); if ((size_t)size < (g_hostname->length() + 1)) @@ -24,13 +24,11 @@ KResultOr Process::sys$gethostname(Userspace buffer, ssize_t size) return 0; } -KResultOr Process::sys$sethostname(Userspace hostname, ssize_t length) +KResultOr Process::sys$sethostname(Userspace hostname, size_t length) { REQUIRE_NO_PROMISES; if (!is_superuser()) return EPERM; - if (length < 0) - return EINVAL; Locker locker(*g_hostname_lock, Lock::Mode::Exclusive); if (length > 64) return ENAMETOOLONG; diff --git a/Kernel/Syscalls/read.cpp b/Kernel/Syscalls/read.cpp index 61fb800997..df9c30ab2b 100644 --- a/Kernel/Syscalls/read.cpp +++ b/Kernel/Syscalls/read.cpp @@ -12,7 +12,7 @@ namespace Kernel { using BlockFlags = Thread::FileBlocker::BlockFlags; -KResultOr Process::sys$readv(int fd, Userspace iov, int iov_count) +KResultOr Process::sys$readv(int fd, Userspace iov, int iov_count) { REQUIRE_PROMISE(stdio); if (iov_count < 0) @@ -68,13 +68,13 @@ KResultOr Process::sys$readv(int fd, Userspace iov return nread; } -KResultOr Process::sys$read(int fd, Userspace buffer, ssize_t size) +KResultOr Process::sys$read(int fd, Userspace buffer, size_t size) { REQUIRE_PROMISE(stdio); - if (size < 0) - return EINVAL; if (size == 0) return 0; + if (size > NumericLimits::max()) + return EINVAL; dbgln_if(IO_DEBUG, "sys$read({}, {}, {})", fd, buffer.ptr(), size); auto description = file_description(fd); if (!description) diff --git a/Kernel/Syscalls/setuid.cpp b/Kernel/Syscalls/setuid.cpp index 729a9f2196..0269e71464 100644 --- a/Kernel/Syscalls/setuid.cpp +++ b/Kernel/Syscalls/setuid.cpp @@ -148,11 +148,9 @@ KResultOr Process::sys$setresgid(gid_t new_rgid, gid_t new_egid, gid_t new_ return 0; } -KResultOr Process::sys$setgroups(ssize_t count, Userspace user_gids) +KResultOr Process::sys$setgroups(size_t count, Userspace user_gids) { REQUIRE_PROMISE(id); - if (count < 0) - return EINVAL; if (!is_superuser()) return EPERM; diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 32f6c3e8cf..1c70666a0a 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -179,7 +179,7 @@ KResultOr Process::sys$shutdown(int sockfd, int how) return socket.shutdown(how); } -KResultOr Process::sys$sendmsg(int sockfd, Userspace user_msg, int flags) +KResultOr Process::sys$sendmsg(int sockfd, Userspace user_msg, int flags) { REQUIRE_PROMISE(stdio); struct msghdr msg; @@ -193,6 +193,8 @@ KResultOr Process::sys$sendmsg(int sockfd, Userspace NumericLimits::max()) + return EINVAL; Userspace user_addr((FlatPtr)msg.msg_name); socklen_t addr_length = msg.msg_namelen; @@ -208,13 +210,10 @@ KResultOr Process::sys$sendmsg(int sockfd, Userspace Process::sys$recvmsg(int sockfd, Userspace user_msg, int flags) +KResultOr Process::sys$recvmsg(int sockfd, Userspace user_msg, int flags) { REQUIRE_PROMISE(stdio); diff --git a/Kernel/Syscalls/write.cpp b/Kernel/Syscalls/write.cpp index 0ba686ca48..88c8217321 100644 --- a/Kernel/Syscalls/write.cpp +++ b/Kernel/Syscalls/write.cpp @@ -11,7 +11,7 @@ namespace Kernel { -KResultOr Process::sys$writev(int fd, Userspace iov, int iov_count) +KResultOr Process::sys$writev(int fd, Userspace iov, int iov_count) { REQUIRE_PROMISE(stdio); if (iov_count < 0) @@ -57,9 +57,9 @@ KResultOr Process::sys$writev(int fd, Userspace io return nwritten; } -KResultOr Process::do_write(FileDescription& description, const UserOrKernelBuffer& data, size_t data_size) +KResultOr Process::do_write(FileDescription& description, const UserOrKernelBuffer& data, size_t data_size) { - ssize_t total_nwritten = 0; + size_t total_nwritten = 0; if (description.should_append() && description.file().is_seekable()) { auto seek_result = description.seek(0, SEEK_END); @@ -96,13 +96,13 @@ KResultOr Process::do_write(FileDescription& description, const UserOrK return total_nwritten; } -KResultOr Process::sys$write(int fd, Userspace data, ssize_t size) +KResultOr Process::sys$write(int fd, Userspace data, size_t size) { REQUIRE_PROMISE(stdio); - if (size < 0) - return EINVAL; if (size == 0) return 0; + if (size > NumericLimits::max()) + return EINVAL; dbgln_if(IO_DEBUG, "sys$write({}, {}, {})", fd, data.ptr(), size); auto description = file_description(fd); diff --git a/Kernel/UserOrKernelBuffer.h b/Kernel/UserOrKernelBuffer.h index 3407975708..93c023a47b 100644 --- a/Kernel/UserOrKernelBuffer.h +++ b/Kernel/UserOrKernelBuffer.h @@ -44,7 +44,7 @@ public: [[nodiscard]] bool is_kernel_buffer() const; [[nodiscard]] const void* user_or_kernel_ptr() const { return m_buffer; } - [[nodiscard]] UserOrKernelBuffer offset(ssize_t offset) const + [[nodiscard]] UserOrKernelBuffer offset(size_t offset) const { if (!m_buffer) return *this; @@ -97,9 +97,10 @@ public: size_t nwritten = 0; while (nwritten < len) { auto to_copy = min(sizeof(buffer), len - nwritten); - ssize_t copied = f(buffer, to_copy); - if (copied < 0) - return copied; + KResultOr copied_or_error = f(buffer, to_copy); + if (copied_or_error.is_error()) + return copied_or_error.error(); + auto copied = copied_or_error.value(); VERIFY((size_t)copied <= to_copy); if (!write(buffer, nwritten, (size_t)copied)) return EFAULT; diff --git a/Kernel/VM/Region.cpp b/Kernel/VM/Region.cpp index d7ace9d177..0c3a03ab80 100644 --- a/Kernel/VM/Region.cpp +++ b/Kernel/VM/Region.cpp @@ -541,7 +541,7 @@ PageFaultResponse Region::handle_inode_fault(size_t page_index_in_region, Scoped // Reading the page may block, so release the MM lock temporarily mm_lock.unlock(); - KResultOr result(KSuccess); + KResultOr result(KSuccess); { ScopedLockRelease release_paging_lock(vmobject().m_paging_lock); auto buffer = UserOrKernelBuffer::for_kernel_buffer(page_buffer);