Module Name: src Committed By: maxv Date: Wed Jul 20 12:33:59 UTC 2016
Modified Files: src/sys/arch/x86/x86: pmap.c Log Message: There is a huge bug in the way a uvm_map_protect is processed on x86. When mprotecting a page, the kernel updates the uvm protection associated with the page, and then gives control to the x86 pmap which splits the procedure in two: if we are restricting the permissions it updates the page tree right away, and if we are increasing the permissions it just waits for the page to fault. In the first case, it forgets to take care of the X permission. Which means that if we allocate an executable page, it is impossible to remove the X permission on it, this being true regardless of whether the mprotect call comes from the kernel or from userland. It is not possible to make sure the page is non executable either, since the only holder of the permission information is uvm, and no track is kept at the pmap level of the actual permissions enforced. In short, the kernel believes the page is non executable, while the cpu knows it is. Fix this by properly taking care of the !VM_PROT_EXECUTE case. Since the bit manipulation is a little tricky we use two vars: bit_rem (remove) and bit_put. To generate a diff of this commit: cvs rdiff -u -r1.212 -r1.213 src/sys/arch/x86/x86/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.