From 2db69d0f24e962c4eaaa41dc998159d330ab8bc6 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 21 Sep 2017 17:35:13 +0900 Subject: [PATCH] process/vm: implement access_ok() --- kernel/include/process.h | 4 ++++ kernel/process.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/kernel/include/process.h b/kernel/include/process.h index 2295757a..5e9499ab 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -834,4 +834,8 @@ void copy_fp_regs(struct thread *from, struct thread *to); void restore_fp_regs(struct thread *proc); void clear_fp_regs(void); +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 +int access_ok(struct process_vm *vm, int type, uintptr_t addr, size_t len); + #endif diff --git a/kernel/process.c b/kernel/process.c index 36a8bd33..be5313aa 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -3607,3 +3607,35 @@ debug_log(unsigned long arg) break; } } + +int access_ok(struct process_vm *vm, int type, uintptr_t addr, size_t len) { + struct vm_range *range, *next; + + range = lookup_process_memory_range(vm, addr, addr + len); + + while (range) { + if ((type == VERIFY_WRITE && !(range->flag & VR_PROT_WRITE)) || + (type == VERIFY_READ && !(range->flag & VR_PROT_READ))) { + kprintf("%s: 0x%llx - 0x%llx does not have prot %s (request was %0x%llx-0x%llx %zu)\n", + __FUNCTION__, range->start, range->end, + type == VERIFY_WRITE ? "write" : "ready", + addr, addr+len, len); + return -EACCES; + } + + if (addr + len < range->end) + break; + + next = next_process_memory_range(vm, range); + if (range->end != next->start) { + kprintf("%s: 0x%llx - 0x%llx and 0x%llx - 0x%llx are not adjacent (request was %0x%llx-0x%llx %zu)\n", + __FUNCTION__, range->start, range->end, + next->start, next->end, + addr, addr+len, len); + return -EFAULT; + } + range = next; + } + + return 0; +}