Avoid unnecessary calls to vm_map_protect() in elf_load_section().
Typically, when elf_load_section() unconditionally passed VM_PROT_ALL to elf_map_insert(), it was needlessly enabling execute access on the mapping, and it would later have to call vm_map_protect() to correct the mapping's access rights. Now, instead, elf_load_section() always passes its parameter "prot" to elf_map_insert(). So, elf_load_section() must only call vm_map_protect() if it needs to remove the write access that was temporarily granted to perform a copyout(). Reviewed by: kib MFC after: 1 week
This commit is contained in:
parent
c059f37b9f
commit
fb24921f88
@ -582,7 +582,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);
|
||||
}
|
||||
@ -603,10 +603,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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user