summaryrefslogtreecommitdiff
path: root/kernel/vm.c
diff options
context:
space:
mode:
authorl0stman <[email protected]>2020-11-10 08:31:16 +0300
committerFrans Kaashoek <[email protected]>2021-08-31 14:20:32 -0400
commit91951429599eb21130432d1802f7bd1b1b7cbd61 (patch)
tree542715d832e6e3ded14e40f1f250152414ece374 /kernel/vm.c
parentf55def8a64f5b5faa7373ba5e35c318cc4ea666f (diff)
downloadxv6-labs-91951429599eb21130432d1802f7bd1b1b7cbd61.tar.gz
xv6-labs-91951429599eb21130432d1802f7bd1b1b7cbd61.tar.bz2
xv6-labs-91951429599eb21130432d1802f7bd1b1b7cbd61.zip
Assert that the size in mappages() is always positive
If va % PGSIZE == 0 and size == 0, we have last < a at the start of the loop so we might never terminate. That being said, this particular case couldn't be triggered for now.
Diffstat (limited to 'kernel/vm.c')
-rw-r--r--kernel/vm.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/vm.c b/kernel/vm.c
index b47f111..d5a12a0 100644
--- a/kernel/vm.c
+++ b/kernel/vm.c
@@ -140,13 +140,16 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
uint64 a, last;
pte_t *pte;
+ if(size == 0)
+ panic("mappages: size");
+
a = PGROUNDDOWN(va);
last = PGROUNDDOWN(va + size - 1);
for(;;){
if((pte = walk(pagetable, a, 1)) == 0)
return -1;
if(*pte & PTE_V)
- panic("remap");
+ panic("mappages: remap");
*pte = PA2PTE(pa) | perm | PTE_V;
if(a == last)
break;