summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/imgact_elf.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 6ae6d67..f7bbdcf 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -596,7 +596,7 @@ __elfN(load_section)(struct image_params *imgp, vm_ooffset_t offset,
/* This had damn well better be true! */
if (map_len != 0) {
rv = __elfN(map_insert)(imgp, map, NULL, 0, map_addr,
- map_addr + map_len, VM_PROT_ALL, 0);
+ map_addr + map_len, prot, 0);
if (rv != KERN_SUCCESS)
return (EINVAL);
}
@@ -617,10 +617,12 @@ __elfN(load_section)(struct image_params *imgp, vm_ooffset_t offset,
}
/*
- * set it to the specified protection.
+ * Remove write access to the page if it was only granted by map_insert
+ * to allow copyout.
*/
- vm_map_protect(map, trunc_page(map_addr), round_page(map_addr +
- map_len), prot, FALSE);
+ if ((prot & VM_PROT_WRITE) == 0)
+ vm_map_protect(map, trunc_page(map_addr), round_page(map_addr +
+ map_len), prot, FALSE);
return (0);
}
OpenPOWER on IntegriCloud