fix usertests to correctly test what happens when you call
exec() with arguments that don't fit on a single page.
This commit is contained in:
parent
15997d5849
commit
5a23692444
4 changed files with 26 additions and 13 deletions
4
entry.S
4
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
|
||||
|
||||
|
|
2
proc.c
2
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;
|
||||
|
|
28
usertests.c
28
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();
|
||||
|
|
5
vm.c
5
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);
|
||||
|
|
Loading…
Reference in a new issue