summaryrefslogtreecommitdiff
path: root/Kernel/Memory/SharedInodeVMObject.cpp
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-08-06 21:05:48 +0300
committerIdan Horowitz <idan.horowitz@gmail.com>2022-09-16 14:55:45 +0300
commit3ad0e1a1d595a931e21c8f4ccfb15f61379fa647 (patch)
treec0bdb1ef1b13716ae881182fe91f711e48f9e513 /Kernel/Memory/SharedInodeVMObject.cpp
parentc88cc8557f20668f575dc07d197b8189c94e46af (diff)
downloadserenity-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.cpp12
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));