Skip to content

Commit

Permalink
Remove the stack guard page. Processes are now contiguous from 0 to p…
Browse files Browse the repository at this point in the history
…roc->sz, which means our syscall argument validation is correct. Add a pointer validation test and remove the stack test, which tested for the guard page.
  • Loading branch information
Austin Clements committed Sep 1, 2010
1 parent 41c4bbb commit b1d41d6
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 24 deletions.
1 change: 0 additions & 1 deletion exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ exec(char *path, char **argv)

// Allocate and initialize stack at sz
sz = PGROUNDUP(sz);
sz += PGSIZE; // leave an invalid page
if(!allocuvm(pgdir, (char *)sz, PGSIZE))
goto bad;
mem = uva2ka(pgdir, (char *)sz);
Expand Down
5 changes: 1 addition & 4 deletions syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ fetchint(struct proc *p, uint addr, int *ip)
return 0;
}

// XXX should we copy the string?

// Fetch the nul-terminated string at addr from process p.
// Doesn't actually copy the string - just sets *pp to point at it.
// Returns length of string, not including nul.
Expand Down Expand Up @@ -62,8 +60,7 @@ argptr(int n, char **pp, int size)
return -1;
if((uint)i >= proc->sz || (uint)i+size >= proc->sz)
return -1;
// *pp = proc->mem + i; // XXXXX
*pp = (char *) i; // XXXXX
*pp = (char *) i;
return 0;
}

Expand Down
60 changes: 41 additions & 19 deletions usertests.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include "user.h"
#include "fs.h"
#include "fcntl.h"
#include "syscall.h"
#include "traps.h"

char buf[2048];
char name[3];
Expand Down Expand Up @@ -1375,26 +1377,46 @@ sbrktest(void)
}

void
stacktest(void)
validateint(int *p)
{
printf(stdout, "stack test\n");
char dummy = 1;
char *p = &dummy;
int ppid = getpid();
int pid = fork();
if(pid < 0){
printf(stdout, "fork failed\n");
exit();
}
if(pid == 0){
// should cause a trap:
p[-4096] = 'z';
kill(ppid);
printf(stdout, "stack test failed: page before stack was writeable\n");
exit();
int res;
asm("mov %%esp, %%ebx\n\t"
"mov %3, %%esp\n\t"
"int %2\n\t"
"mov %%ebx, %%esp" :
"=a" (res) :
"a" (SYS_sleep), "n" (T_SYSCALL), "c" (p) :
"ebx");
}

void
validatetest(void)
{
int hi = 1100*1024;

printf(stdout, "validate test\n");

uint p;
for (p = 0; p <= (uint)hi; p += 4096) {
int pid;
if ((pid = fork()) == 0) {
// try to crash the kernel by passing in a badly placed integer
validateint((int*)p);
exit();
}
sleep(0);
sleep(0);
kill(pid);
wait();

// try to crash the kernel by passing in a bad string pointer
if (link("nosuchfile", (char*)p) != -1) {
printf(stdout, "link should not succeed\n");
exit();
}
}
wait();
printf(stdout, "stack test OK\n");

printf(stdout, "validate ok\n");
}

int
Expand All @@ -1408,8 +1430,8 @@ main(int argc, char *argv[])
}
close(open("usertests.ran", O_CREATE));

stacktest();
sbrktest();
validatetest();

opentest();
writetest();
Expand Down

0 comments on commit b1d41d6

Please sign in to comment.