Skip to content
Snippets Groups Projects
Commit 4fc0c492 authored by Videau Luc's avatar Videau Luc
Browse files

add perms check in do_allocate

parent b9060210
No related branches found
No related tags found
No related merge requests found
......@@ -343,6 +343,7 @@ void userinit(void) {
uvminit(p->pagetable, initcode, sizeof(initcode));
add_memory_area(p, 0, PGSIZE);
p->memory_areas->vma_flags = VMA_R | VMA_X;
// prepare for the very first "return" from kernel to user.
p->tf->epc = 0; // user program counter
......
......@@ -379,6 +379,19 @@ int load_from_file(char* file,
int do_allocate(pagetable_t pagetable, struct proc* p, uint64 addr, uint64 scause){
pte_t* ad = walk(pagetable, addr, 0);
struct vma* mem_area = get_memory_area(p, addr);
switch (scause)
{
case CAUSE_R:
if ((mem_area->vma_flags & VMA_R) == 0) return EBADPERM;
break;
case CAUSE_W:
if ((mem_area->vma_flags & VMA_W) == 0) return EBADPERM;
break;
case CAUSE_X:
if ((mem_area->vma_flags & VMA_X) == 0) return EBADPERM;
break;
}
if(!mem_area){
return ENOVMA;
}
......@@ -389,7 +402,11 @@ int do_allocate(pagetable_t pagetable, struct proc* p, uint64 addr, uint64 scaus
{
return ENOMEM;
}
if (mappages(pagetable, addr, PGSIZE, pa, PTE_W | PTE_X | PTE_R | PTE_U) != 0)
int flags = PTE_U;
flags |= (mem_area->vma_flags & VMA_R) != 0 ? PTE_R : 0;
flags |= (mem_area->vma_flags & VMA_W) != 0 ? PTE_W : 0;
flags |= (mem_area->vma_flags & VMA_X) != 0 ? PTE_X : 0;
if (mappages(pagetable, addr, PGSIZE, pa, flags) != 0)
{
kfree((void*)pa);
return EMAPFAILED;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment