diff options
Diffstat (limited to 'user')
| -rw-r--r-- | user/usertests.c | 25 | 
1 files changed, 22 insertions, 3 deletions
| diff --git a/user/usertests.c b/user/usertests.c index 0f4a443..608cd3f 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -1924,9 +1924,10 @@ pgbug(char *s)  }  // does the kernel panic if a process sbrk()s its size to be less than -// a page, or zero? +// a page, or zero, or reduces the break by an amount too small to +// cause a page to be freed?  void -zerosize(char *s) +sbrkbugs(char *s)  {    int pid = fork();    if(pid < 0){ @@ -1959,6 +1960,24 @@ zerosize(char *s)    }    wait(0); +  pid = fork(); +  if(pid < 0){ +    printf("fork failed\n"); +    exit(1); +  } +  if(pid == 0){ +    // set the break in the middle of a page. +    sbrk((10*4096 + 2048) - (uint64)sbrk(0)); + +    // reduce the break a bit, but not enough to +    // cause a page to be freed. this used to cause +    // a panic. +    sbrk(-10); + +    exit(0); +  } +  wait(0); +    exit(0);  } @@ -2000,7 +2019,7 @@ main(int argc, char *argv[])      char *s;    } tests[] = {      {pgbug, "pgbug" }, -    {zerosize, "zerosize" }, +    {sbrkbugs, "sbrkbugs" },      {reparent, "reparent" },      {twochildren, "twochildren"},      {forkfork, "forkfork"}, | 
