diff --git a/Kernel/FileSystem/FileDescription.cpp b/Kernel/FileSystem/FileDescription.cpp index 7e60cb43d6..be2c806a32 100644 --- a/Kernel/FileSystem/FileDescription.cpp +++ b/Kernel/FileSystem/FileDescription.cpp @@ -157,6 +157,20 @@ KResultOr FileDescription::seek(off_t offset, int whence) return m_current_offset; } +KResultOr FileDescription::read(UserOrKernelBuffer& buffer, u64 offset, size_t count) +{ + if (Checked::addition_would_overflow(offset, count)) + return EOVERFLOW; + return m_file->read(*this, offset, buffer, count); +} + +KResultOr FileDescription::write(u64 offset, UserOrKernelBuffer const& data, size_t data_size) +{ + if (Checked::addition_would_overflow(offset, data_size)) + return EOVERFLOW; + return m_file->write(*this, offset, data, data_size); +} + KResultOr FileDescription::read(UserOrKernelBuffer& buffer, size_t count) { Locker locker(m_lock); diff --git a/Kernel/FileSystem/FileDescription.h b/Kernel/FileSystem/FileDescription.h index 4bd60f922f..81bab057b4 100644 --- a/Kernel/FileSystem/FileDescription.h +++ b/Kernel/FileSystem/FileDescription.h @@ -51,6 +51,10 @@ public: KResultOr write(const UserOrKernelBuffer& data, size_t); KResult stat(::stat&); + // NOTE: These ignore the current offset of this file description. + KResultOr read(UserOrKernelBuffer&, u64 offset, size_t); + KResultOr write(u64 offset, UserOrKernelBuffer const&, size_t); + KResult chmod(mode_t); bool can_read() const;