Commit 3377ea43 authored by Linus Torvalds's avatar Linus Torvalds

Fix mprotect() to do proper PROT_xxx -> VM_xxx translation.

This also fixes the bug with MAP_SEM being potentially
interpreted as VM_SHARED.
parent d04668a7
...@@ -224,7 +224,7 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, ...@@ -224,7 +224,7 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev,
asmlinkage long asmlinkage long
sys_mprotect(unsigned long start, size_t len, unsigned long prot) sys_mprotect(unsigned long start, size_t len, unsigned long prot)
{ {
unsigned long nstart, end, tmp; unsigned long vm_flags, nstart, end, tmp;
struct vm_area_struct * vma, * next, * prev; struct vm_area_struct * vma, * next, * prev;
int error = -EINVAL; int error = -EINVAL;
...@@ -239,6 +239,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot) ...@@ -239,6 +239,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
if (end == start) if (end == start)
return 0; return 0;
vm_flags = calc_vm_prot_bits(prot);
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
vma = find_vma_prev(current->mm, start, &prev); vma = find_vma_prev(current->mm, start, &prev);
...@@ -257,7 +259,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot) ...@@ -257,7 +259,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
goto out; goto out;
} }
newflags = prot | (vma->vm_flags & ~(PROT_READ | PROT_WRITE | PROT_EXEC)); newflags = vm_flags | (vma->vm_flags & ~(VM_READ | VM_WRITE | VM_EXEC));
if ((newflags & ~(newflags >> 4)) & 0xf) { if ((newflags & ~(newflags >> 4)) & 0xf) {
error = -EACCES; error = -EACCES;
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment