From ce1bf3724e30e1ea5669ed7fe9fcbf5e9d423493 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Sun, 19 Dec 2021 01:01:11 +0100 Subject: [PATCH] Kernel: Replace intersecting ranges in mmap when MAP_FIXED is specified This behavior is mandated by POSIX and is used by software like Wine after reserving large chunks of the address range. --- Kernel/Syscalls/mmap.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 4fc530b66a..b4e901cd75 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -189,11 +189,16 @@ ErrorOr Process::sys$mmap(Userspace use if (map_randomized) { return address_space().page_directory().range_allocator().try_allocate_randomized(Memory::page_round_up(size), alignment); } + auto range = address_space().try_allocate_range(VirtualAddress(addr), size, alignment); if (range.is_error()) { if (addr && !map_fixed) { // If there's an address but MAP_FIXED wasn't specified, the address is just a hint. range = address_space().try_allocate_range({}, size, alignment); + } else if (map_fixed) { + // If MAP_FIXED is specified, existing mappings that intersect the requested range are removed. + TRY(address_space().unmap_mmap_range(VirtualAddress(addr), size)); + range = address_space().try_allocate_range(VirtualAddress(addr), size, alignment); } } return range;