aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2014-10-28 00:50:07 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2014-10-28 00:50:07 -0700
commit514adef4868460944738f39734f282dc14e4d744 (patch)
tree6d19a7b5f321dd946941930da732f3cad480ee1a /pk
parent6d45e8de32cce54e3cc6688545e58da5a9aaead7 (diff)
downloadpk-514adef4868460944738f39734f282dc14e4d744.zip
pk-514adef4868460944738f39734f282dc14e4d744.tar.gz
pk-514adef4868460944738f39734f282dc14e4d744.tar.bz2
don't forget to release locks!
Diffstat (limited to 'pk')
-rw-r--r--pk/vm.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/pk/vm.c b/pk/vm.c
index 53dd971..6378137 100644
--- a/pk/vm.c
+++ b/pk/vm.c
@@ -356,21 +356,25 @@ uintptr_t do_mprotect(uintptr_t addr, size_t length, int prot)
for (uintptr_t a = addr; a < addr + length; a += RISCV_PGSIZE)
{
pte_t* pte = __walk(a);
- if (pte == 0 || *pte == 0)
- return -ENOMEM;
+ if (pte == 0 || *pte == 0) {
+ res = -ENOMEM;
+ break;
+ }
if(!(*pte & PTE_V)){
vmr_t* v = (vmr_t*)*pte;
if((v->prot ^ prot) & ~v->prot){
//TODO:look at file to find perms
- return -EACCES;
+ res = -EACCES;
+ break;
}
v->prot = prot;
}else{
pte_t perms = pte_create(0, 0, prot);
if ((*pte & perms) != perms){
//TODO:look at file to find perms
- return -EACCES;
+ res = -EACCES;
+ break;
}
pte_t permset = (*pte & ~(PTE_UR | PTE_UW | PTE_UX)) | perms;
*pte = permset;