From 81699345ccda59dfe27598799e5a2b038aa368f3 Mon Sep 17 00:00:00 2001 From: Dominique MARTINET Date: Fri, 25 May 2018 03:10:10 +0200 Subject: [PATCH] mprotect: do not set page table writable for cow pages Change-Id: If8b0bb56e7dae59aa9dc3d745a4cc4e43bf4bf9a --- kernel/process.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/kernel/process.c b/kernel/process.c index 3dda3ea7..377e0e08 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1438,6 +1438,20 @@ int change_prot_process_memory_range(struct process_vm *vm, clrattr = oldattr & ~newattr; setattr = newattr & ~oldattr; + /* + * If this is a file mapping don't set any new prot write. + * We need to keep the page table read-only to trigger a page + * fault for copy-on-write later on + */ + if (range->memobj && (range->flag & VR_PRIVATE)) { + setattr &= ~PTATTR_WRITABLE; + if (clrattr == setattr == 0) { + range->flag = newflag; + error = 0; + goto out; + } + } + ihk_mc_spinlock_lock_noirq(&vm->page_table_lock); error = ihk_mc_pt_change_attr_range(vm->address_space->page_table, (void *)range->start, (void *)range->end,