diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 2282ec02b3..6f6f08c3f0 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -536,7 +536,6 @@ KResultOr Process::sys$mremap(Userspacevmobject().is_shared_inode() && params.flags & MAP_PRIVATE && !(params.flags & (MAP_ANONYMOUS | MAP_NORESERVE))) { auto range = old_region->range(); - auto old_name = old_region->name(); auto old_prot = region_access_flags_to_prot(old_region->access()); auto old_offset = old_region->offset_in_vmobject(); NonnullRefPtr inode = static_cast(old_region->vmobject()).inode(); @@ -545,12 +544,14 @@ KResultOr Process::sys$mremap(Userspacetake_name(); + // Unmap without deallocating the VM range since we're going to reuse it. old_region->unmap(Region::ShouldDeallocateVirtualMemoryRange::No); bool success = space().deallocate_region(*old_region); VERIFY(success); - auto new_region_or_error = space().allocate_region_with_vmobject(range, new_vmobject.release_nonnull(), old_offset, old_name, old_prot, false); + auto new_region_or_error = space().allocate_region_with_vmobject(range, new_vmobject.release_nonnull(), old_offset, old_name->view(), old_prot, false); if (new_region_or_error.is_error()) return new_region_or_error.error().error(); auto& new_region = *new_region_or_error.value(); diff --git a/Kernel/VM/Region.h b/Kernel/VM/Region.h index 094a88de4b..ebbabe8bae 100644 --- a/Kernel/VM/Region.h +++ b/Kernel/VM/Region.h @@ -68,6 +68,7 @@ public: bool is_cacheable() const { return m_cacheable; } StringView name() const { return m_name ? m_name->view() : StringView {}; } + OwnPtr take_name() { return move(m_name); } Region::Access access() const { return static_cast(m_access); } void set_name(OwnPtr name) { m_name = move(name); }