From b1e10575aa4d52c5955aedd828eb84a07f35ca4b Mon Sep 17 00:00:00 2001 From: Dave Kleikamp Date: Tue, 8 Jul 2008 00:28:51 +1000 Subject: [PATCH] --- yaml --- r: 101771 b: refs/heads/master c: b845f313d78e4e259ec449909e3bbadf77b53a6d h: refs/heads/master i: 101769: 55cf247b064c24c033b5b0dd81e43a09248467f0 101767: cd3aae277f7436f4f92a6f3bfb5d1f3983832c69 v: v3 --- [refs] | 2 +- trunk/include/linux/mman.h | 29 ++++++++++++++++++++++++++++- trunk/mm/mmap.c | 5 +++-- trunk/mm/mprotect.c | 2 +- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a658b1ec2e1d..43069ef7c2ed 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e5093ff05d36c64e8f36a9ddb26358256dc133ea +refs/heads/master: b845f313d78e4e259ec449909e3bbadf77b53a6d diff --git a/trunk/include/linux/mman.h b/trunk/include/linux/mman.h index dab8892e6ff1..30d1073bac3b 100644 --- a/trunk/include/linux/mman.h +++ b/trunk/include/linux/mman.h @@ -33,6 +33,32 @@ static inline void vm_unacct_memory(long pages) vm_acct_memory(-pages); } +/* + * Allow architectures to handle additional protection bits + */ + +#ifndef arch_calc_vm_prot_bits +#define arch_calc_vm_prot_bits(prot) 0 +#endif + +#ifndef arch_vm_get_page_prot +#define arch_vm_get_page_prot(vm_flags) __pgprot(0) +#endif + +#ifndef arch_validate_prot +/* + * This is called from mprotect(). PROT_GROWSDOWN and PROT_GROWSUP have + * already been masked out. + * + * Returns true if the prot flags are valid + */ +static inline int arch_validate_prot(unsigned long prot) +{ + return (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) == 0; +} +#define arch_validate_prot arch_validate_prot +#endif + /* * Optimisation macro. It is equivalent to: * (x & bit1) ? bit2 : 0 @@ -51,7 +77,8 @@ calc_vm_prot_bits(unsigned long prot) { return _calc_vm_trans(prot, PROT_READ, VM_READ ) | _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) | - _calc_vm_trans(prot, PROT_EXEC, VM_EXEC ); + _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) | + arch_calc_vm_prot_bits(prot); } /* diff --git a/trunk/mm/mmap.c b/trunk/mm/mmap.c index 3354fdd83d4b..1d102b956fd8 100644 --- a/trunk/mm/mmap.c +++ b/trunk/mm/mmap.c @@ -72,8 +72,9 @@ pgprot_t protection_map[16] = { pgprot_t vm_get_page_prot(unsigned long vm_flags) { - return protection_map[vm_flags & - (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; + return __pgprot(pgprot_val(protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | + pgprot_val(arch_vm_get_page_prot(vm_flags))); } EXPORT_SYMBOL(vm_get_page_prot); diff --git a/trunk/mm/mprotect.c b/trunk/mm/mprotect.c index a5bf31c27375..ecfaa5844b5f 100644 --- a/trunk/mm/mprotect.c +++ b/trunk/mm/mprotect.c @@ -239,7 +239,7 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot) end = start + len; if (end <= start) return -ENOMEM; - if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) + if (!arch_validate_prot(prot)) return -EINVAL; reqprot = prot;