diff options
author | Liav A <liavalb@gmail.com> | 2022-08-06 21:05:48 +0300 |
---|---|---|
committer | Idan Horowitz <idan.horowitz@gmail.com> | 2022-09-16 14:55:45 +0300 |
commit | 3ad0e1a1d595a931e21c8f4ccfb15f61379fa647 (patch) | |
tree | c0bdb1ef1b13716ae881182fe91f711e48f9e513 /Kernel/Memory/SharedInodeVMObject.cpp | |
parent | c88cc8557f20668f575dc07d197b8189c94e46af (diff) | |
download | serenity-3ad0e1a1d595a931e21c8f4ccfb15f61379fa647.zip |
Kernel: Handle mmap requests on zero-length data file inodes safely
Diffstat (limited to 'Kernel/Memory/SharedInodeVMObject.cpp')
-rw-r--r-- | Kernel/Memory/SharedInodeVMObject.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/Kernel/Memory/SharedInodeVMObject.cpp b/Kernel/Memory/SharedInodeVMObject.cpp index aa78cd2aac..4cf5475cb4 100644 --- a/Kernel/Memory/SharedInodeVMObject.cpp +++ b/Kernel/Memory/SharedInodeVMObject.cpp @@ -12,7 +12,17 @@ namespace Kernel::Memory { ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> SharedInodeVMObject::try_create_with_inode(Inode& inode) { - size_t size = inode.size(); + if (inode.size() == 0) + return EINVAL; + return try_create_with_inode_and_range(inode, 0, inode.size()); +} + +ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> SharedInodeVMObject::try_create_with_inode_and_range(Inode& inode, u64 offset, size_t range_size) +{ + // Note: To ensure further allocation of a Region with this VMObject will not complain + // on "smaller" VMObject than the requested Region, we simply take the max size between both values. + auto size = max(inode.size(), (offset + range_size)); + VERIFY(size > 0); if (auto shared_vmobject = inode.shared_vmobject()) return shared_vmobject.release_nonnull(); auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); |