diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-15 14:09:55 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-15 14:09:55 -0700 |
commit | 80c5606c3b45e0176c32d3108ade1e1cb0b954f3 (patch) | |
tree | 441944cc1c2e47e2d34cabb5313c25e03f3284d3 | |
parent | a7a0d86f5aa40a2215e36fe21d7911cf718ba428 (diff) | |
download | linux-80c5606c3b45e0176c32d3108ade1e1cb0b954f3.tar.gz linux-80c5606c3b45e0176c32d3108ade1e1cb0b954f3.tar.bz2 linux-80c5606c3b45e0176c32d3108ade1e1cb0b954f3.zip |
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>
-rw-r--r-- | mm/mmap.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index eea8eefd51a8..497e502dfd6b 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -900,17 +900,6 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, int accountable = 1; 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? * @@ -1000,6 +989,16 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, case MAP_PRIVATE: if (!(file->f_mode & FMODE_READ)) 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; default: |