]> git.neil.brown.name Git - history.git/commitdiff
Fix mprotect() to do proper PROT_xxx -> VM_xxx translation.
authorLinus Torvalds <torvalds@home.osdl.org>
Fri, 5 Sep 2003 05:05:07 +0000 (22:05 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Fri, 5 Sep 2003 05:05:07 +0000 (22:05 -0700)
This also fixes the bug with MAP_SEM being potentially
interpreted as VM_SHARED.

mm/mprotect.c

index 2c015794e3c1a8cc659e43927e1777987075103a..699962ebd1e48cf047ffdf7221605be05ed1eb97 100644 (file)
@@ -224,7 +224,7 @@ fail:
 asmlinkage long
 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;
        int error = -EINVAL;
 
@@ -239,6 +239,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
        if (end == start)
                return 0;
 
+       vm_flags = calc_vm_prot_bits(prot);
+
        down_write(&current->mm->mmap_sem);
 
        vma = find_vma_prev(current->mm, start, &prev);
@@ -257,7 +259,8 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
                        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) {
                        error = -EACCES;
                        goto out;