From 5a236924444db768813d726ae165d263856d8bff Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Thu, 1 Sep 2011 12:02:49 -0400 Subject: [PATCH] fix usertests to correctly test what happens when you call exec() with arguments that don't fit on a single page. --- entry.S | 4 ++-- proc.c | 2 +- usertests.c | 28 ++++++++++++++++++++-------- vm.c | 5 +++-- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/entry.S b/entry.S index f814aeb..4fd85c6 100644 --- a/entry.S +++ b/entry.S @@ -54,10 +54,10 @@ entry: # Set up the stack pointer. movl $(stack + STACK), %esp - # Call main(), which switches to executing at + # Jump to main(), and switch to executing at # high addresses. The indirect call is needed because # the assembler produces a PC-relative instruction - # for a direct call. + # for a direct jump. mov $main, %eax jmp *%eax diff --git a/proc.c b/proc.c index bdc119f..05cb85f 100644 --- a/proc.c +++ b/proc.c @@ -49,7 +49,7 @@ found: p->pid = nextpid++; release(&ptable.lock); - // Allocate kernel stack if possible. + // Allocate kernel stack. if((p->kstack = kalloc()) == 0){ p->state = UNUSED; return 0; diff --git a/usertests.c b/usertests.c index 655610c..62ce8d7 100644 --- a/usertests.c +++ b/usertests.c @@ -1508,30 +1508,41 @@ bsstest(void) printf(stdout, "bss test ok\n"); } -// does exec do something sensible if the arguments -// are larger than a page? +// does exec return an error if the arguments +// are larger than a page? or does it write +// below the stack and wreck the instructions/data? void bigargtest(void) { - int pid, ppid; + int pid, ppid, fd; + unlink("bigarg-ok"); ppid = getpid(); pid = fork(); if(pid == 0){ - char *args[32+1]; + static char *args[MAXARG]; int i; - for(i = 0; i < 32; i++) - args[i] = "bigargs test: failed\n "; - args[32] = 0; - printf(stdout, "bigarg test\n"); + for(i = 0; i < MAXARG-1; i++) + args[i] = "bigargs test: failed\n "; + args[MAXARG-1] = 0; + printf(stdout, "bigarg test %d\n", (MAXARG-1)*strlen(args[0])); exec("echo", args); printf(stdout, "bigarg test ok\n"); + fd = open("bigarg-ok", O_CREATE); + close(fd); exit(); } else if(pid < 0){ printf(stdout, "bigargtest: fork failed\n"); exit(); } wait(); + fd = open("bigarg-ok", 0); + if(fd < 0){ + printf(stdout, "bigarg test failed!\n"); + exit(); + } + close(fd); + unlink("bigarg-ok"); } // what happens when the file system runs out of blocks? @@ -1606,6 +1617,7 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); + bigargtest(); bigwrite(); bigargtest(); bsstest(); diff --git a/vm.c b/vm.c index 32775a1..7bda3dd 100644 --- a/vm.c +++ b/vm.c @@ -68,7 +68,8 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void)) // physical addresses starting at pa. va and size might not // be page-aligned. static int -mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm, char* (*alloc)(void)) +mappages(pde_t *pgdir, void *va, uint size, uint pa, + int perm, char* (*alloc)(void)) { char *a, *last; pte_t *pte; @@ -343,7 +344,7 @@ copyout(pde_t *pgdir, uint va, void *p, uint len) { char *buf, *pa0; uint n, va0; - + buf = (char*)p; while(len > 0){ va0 = (uint)PGROUNDDOWN(va);