From f4e7aecec24d1aa910e22a782f169efdfdfd564b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 25 Jan 2020 17:57:10 +0100 Subject: [PATCH] Kernel: Preserve CoW bits when splitting VM regions --- Kernel/Process.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 51a2e7e574..9603692e58 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -167,7 +167,13 @@ static unsigned prot_to_region_access_flags(int prot) Region& Process::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject) { - return add_region(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access())); + auto& region = add_region(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access())); + size_t page_offset_in_source_region = (offset_in_vmobject - source_region.offset_in_vmobject()) / PAGE_SIZE; + for (size_t i = 0; i < region.page_count(); ++i) { + if (source_region.should_cow(page_offset_in_source_region + i)) + region.set_should_cow(i, true); + } + return region; } Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)