Fix VM_MAYEXEC calculation
.. and clean up the file mapping code while at it. No point in having a "if (file)" repeated twice, and generally doing similar checks in two different sections of the same code Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a7a0d86f5a
commit
80c5606c3b
21
mm/mmap.c
21
mm/mmap.c
@ -900,17 +900,6 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
|
|||||||
int accountable = 1;
|
int accountable = 1;
|
||||||
unsigned long charged = 0, reqprot = prot;
|
unsigned long charged = 0, reqprot = prot;
|
||||||
|
|
||||||
if (file) {
|
|
||||||
if (is_file_hugepages(file))
|
|
||||||
accountable = 0;
|
|
||||||
|
|
||||||
if (!file->f_op || !file->f_op->mmap)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
if ((prot & PROT_EXEC) &&
|
|
||||||
(file->f_vfsmnt->mnt_flags & MNT_NOEXEC))
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Does the application expect PROT_READ to imply PROT_EXEC?
|
* Does the application expect PROT_READ to imply PROT_EXEC?
|
||||||
*
|
*
|
||||||
@ -1000,6 +989,16 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
|
|||||||
case MAP_PRIVATE:
|
case MAP_PRIVATE:
|
||||||
if (!(file->f_mode & FMODE_READ))
|
if (!(file->f_mode & FMODE_READ))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
if (file->f_vfsmnt->mnt_flags & MNT_NOEXEC) {
|
||||||
|
if (vm_flags & VM_EXEC)
|
||||||
|
return -EPERM;
|
||||||
|
vm_flags &= ~VM_MAYEXEC;
|
||||||
|
}
|
||||||
|
if (is_file_hugepages(file))
|
||||||
|
accountable = 0;
|
||||||
|
|
||||||
|
if (!file->f_op || !file->f_op->mmap)
|
||||||
|
return -ENODEV;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user