diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index cfe775c20c..bf3030f524 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -184,8 +185,16 @@ ErrorOr Process::sys$mmap(Userspace use return EINVAL; Memory::Region* region = nullptr; + Memory::VirtualRange range { {}, 0 }; - auto range = TRY([&]() -> ErrorOr { + ArmedScopeGuard scope_guard = [&] { + if (region) + address_space().deallocate_region(*region); + else if (range.is_valid()) + address_space().page_directory().range_allocator().deallocate(range); + }; + + range = TRY([&]() -> ErrorOr { if (map_randomized) return address_space().page_directory().range_allocator().try_allocate_randomized(rounded_size, alignment); @@ -248,6 +257,8 @@ ErrorOr Process::sys$mmap(Userspace use PerformanceManager::add_mmap_perf_event(*this, *region); + scope_guard.disarm(); + return region->vaddr().get(); }