From 706cfeb44352b77182aef0b3ee9f5d383783ade1 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 26 Aug 2025 17:42:48 +0300 Subject: [PATCH] Kernel: Allow file backed mapping be larger than inode size This is only allowed if the mapping does **not** exceed a page boundary. Some port was doing an exactly two-page-mapping on a file that was one and a half page long --- kernel/kernel/Memory/FileBackedRegion.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel/kernel/Memory/FileBackedRegion.cpp b/kernel/kernel/Memory/FileBackedRegion.cpp index fdfbe383..b80c9173 100644 --- a/kernel/kernel/Memory/FileBackedRegion.cpp +++ b/kernel/kernel/Memory/FileBackedRegion.cpp @@ -13,7 +13,12 @@ namespace Kernel if (offset < 0 || offset % PAGE_SIZE || size == 0) return BAN::Error::from_errno(EINVAL); - if ((size > (size_t)inode->size() || (size_t)offset > (size_t)inode->size() - size)) + + size_t inode_size_aligned = inode->size(); + if (auto rem = inode_size_aligned % PAGE_SIZE) + inode_size_aligned += PAGE_SIZE - rem; + + if ((size > inode_size_aligned || static_cast(offset) > inode_size_aligned - size)) return BAN::Error::from_errno(EOVERFLOW); auto* region_ptr = new FileBackedRegion(inode, page_table, offset, size, type, flags, status_flags);