Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 101771
b: refs/heads/master
c: b845f31
h: refs/heads/master
i:
  101769: 55cf247
  101767: cd3aae2
v: v3
  • Loading branch information
Dave Kleikamp authored and Benjamin Herrenschmidt committed Jul 9, 2008
1 parent 0b94459 commit b1e1057
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e5093ff05d36c64e8f36a9ddb26358256dc133ea
refs/heads/master: b845f313d78e4e259ec449909e3bbadf77b53a6d
29 changes: 28 additions & 1 deletion trunk/include/linux/mman.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

/*
Expand Down
5 changes: 3 additions & 2 deletions trunk/mm/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion trunk/mm/mprotect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit b1e1057

Please sign in to comment.