From 49d6ad663385ed61db63ec795cfaecdf6fab610a Mon Sep 17 00:00:00 2001 From: Hendiadyoin1 Date: Thu, 18 Nov 2021 11:16:53 +0100 Subject: [PATCH] Kernel: Handle more error cases in sys$msync --- Kernel/Syscalls/mmap.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index e7dd72ad59..97d31592c7 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -590,12 +590,27 @@ ErrorOr Process::sys$msyscall(Userspace address) return 0; } -ErrorOr Process::sys$msync(Userspace address, size_t size, [[maybe_unused]] int flags) +ErrorOr Process::sys$msync(Userspace address, size_t size, int flags) { + if ((flags & (MS_SYNC | MS_ASYNC | MS_INVALIDATE)) != flags) + return EINVAL; + + bool is_async = (flags & MS_ASYNC) == MS_ASYNC; + bool is_sync = (flags & MS_SYNC) == MS_SYNC; + if (is_sync == is_async) + return EINVAL; + + if (address.ptr() % PAGE_SIZE != 0) + return EINVAL; + + // Note: This is not specified + size = Memory::page_round_up(size); + // FIXME: We probably want to sync all mappings in the address+size range. auto* region = address_space().find_region_from_range(Memory::VirtualRange { address.vaddr(), size }); + // All regions from address upto address+size shall be mapped if (!region) - return EINVAL; + return ENOMEM; auto& vmobject = region->vmobject(); if (!vmobject.is_shared_inode()) @@ -603,6 +618,7 @@ ErrorOr Process::sys$msync(Userspace address, size_t size, [[may auto& inode_vmobject = static_cast(vmobject); TRY(inode_vmobject.sync()); + // FIXME: If msync() causes any write to a file, the file's st_ctime and st_mtime fields shall be marked for update. return 0; }