diff options
Diffstat (limited to 'usertests.c')
-rw-r--r-- | usertests.c | 210 |
1 files changed, 156 insertions, 54 deletions
diff --git a/usertests.c b/usertests.c index 670a4a8..296731a 100644 --- a/usertests.c +++ b/usertests.c @@ -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]; @@ -45,12 +47,12 @@ writetest(void) printf(stdout, "error: creat small failed!\n"); exit(); } - for(i = 0; i < 100; i++) { - if(write(fd, "aaaaaaaaaa", 10) != 10) { + for(i = 0; i < 100; i++){ + if(write(fd, "aaaaaaaaaa", 10) != 10){ printf(stdout, "error: write aa %d new file failed\n", i); exit(); } - if(write(fd, "bbbbbbbbbb", 10) != 10) { + if(write(fd, "bbbbbbbbbb", 10) != 10){ printf(stdout, "error: write bb %d new file failed\n", i); exit(); } @@ -65,7 +67,7 @@ writetest(void) exit(); } i = read(fd, buf, 2000); - if(i == 2000) { + if(i == 2000){ printf(stdout, "read succeeded ok\n"); } else { printf(stdout, "read failed\n"); @@ -73,7 +75,7 @@ writetest(void) } close(fd); - if(unlink("small") < 0) { + if(unlink("small") < 0){ printf(stdout, "unlink small failed\n"); exit(); } @@ -93,9 +95,9 @@ writetest1(void) exit(); } - for(i = 0; i < MAXFILE; i++) { - ((int*) buf)[0] = i; - if(write(fd, buf, 512) != 512) { + for(i = 0; i < MAXFILE; i++){ + ((int*)buf)[0] = i; + if(write(fd, buf, 512) != 512){ printf(stdout, "error: write big file failed\n", i); exit(); } @@ -110,19 +112,19 @@ writetest1(void) } n = 0; - for(;;) { + for(;;){ i = read(fd, buf, 512); - if(i == 0) { - if(n == MAXFILE - 1) { + if(i == 0){ + if(n == MAXFILE - 1){ printf(stdout, "read only %d blocks from big", n); exit(); } break; - } else if(i != 512) { + } else if(i != 512){ printf(stdout, "read failed %d\n", i); exit(); } - if(((int*)buf)[0] != n) { + if(((int*)buf)[0] != n){ printf(stdout, "read content of block %d is %d\n", n, ((int*)buf)[0]); exit(); @@ -130,7 +132,7 @@ writetest1(void) n++; } close(fd); - if(unlink("big") < 0) { + if(unlink("big") < 0){ printf(stdout, "unlink big failed\n"); exit(); } @@ -146,14 +148,14 @@ createtest(void) name[0] = 'a'; name[2] = '\0'; - for(i = 0; i < 52; i++) { + for(i = 0; i < 52; i++){ name[1] = '0' + i; fd = open(name, O_CREATE|O_RDWR); close(fd); } name[0] = 'a'; name[2] = '\0'; - for(i = 0; i < 52; i++) { + for(i = 0; i < 52; i++){ name[1] = '0' + i; unlink(name); } @@ -164,22 +166,22 @@ void dirtest(void) { printf(stdout, "mkdir test\n"); - if(mkdir("dir0") < 0) { + if(mkdir("dir0") < 0){ printf(stdout, "mkdir failed\n"); exit(); } - if(chdir("dir0") < 0) { + if(chdir("dir0") < 0){ printf(stdout, "chdir dir0 failed\n"); exit(); } - if(chdir("..") < 0) { + if(chdir("..") < 0){ printf(stdout, "chdir .. failed\n"); exit(); } - if(unlink("dir0") < 0) { + if(unlink("dir0") < 0){ printf(stdout, "unlink dir0 failed\n"); exit(); } @@ -190,7 +192,7 @@ void exectest(void) { printf(stdout, "exec test\n"); - if(exec("echo", echoargv) < 0) { + if(exec("echo", echoargv) < 0){ printf(stdout, "exec echo failed\n"); exit(); } @@ -324,20 +326,21 @@ mem(void) void *m1, *m2; int pid, ppid; + printf(1, "mem test\n"); ppid = getpid(); if((pid = fork()) == 0){ m1 = 0; - while((m2 = malloc(10001)) != 0) { - *(char**) m2 = m1; + while((m2 = malloc(10001)) != 0){ + *(char**)m2 = m1; m1 = m2; } - while(m1) { + while(m1){ m2 = *(char**)m1; free(m1); m1 = m2; } m1 = malloc(1024*20); - if(m1 == 0) { + if(m1 == 0){ printf(1, "couldn't allocate mem?!!\n"); kill(ppid); exit(); @@ -1234,16 +1237,18 @@ forktest(void) void sbrktest(void) { - int pid; - char *oldbrk = sbrk(0); + int fds[2], pid, pids[32], ppid; + char *a, *b, *c, *lastaddr, *oldbrk, *p, scratch; + uint amt; printf(stdout, "sbrk test\n"); + oldbrk = sbrk(0); // can one sbrk() less than a page? - char *a = sbrk(0); + a = sbrk(0); int i; for(i = 0; i < 5000; i++){ - char *b = sbrk(1); + b = sbrk(1); if(b != a){ printf(stdout, "sbrk test failed %d %x %x\n", i, a, b); exit(); @@ -1256,7 +1261,7 @@ sbrktest(void) printf(stdout, "sbrk test fork failed\n"); exit(); } - char *c = sbrk(1); + c = sbrk(1); c = sbrk(1); if(c != a + 1){ printf(stdout, "sbrk test failed post-fork\n"); @@ -1268,18 +1273,18 @@ sbrktest(void) // can one allocate the full 640K? a = sbrk(0); - uint amt = (640 * 1024) - (uint) a; - char *p = sbrk(amt); + amt = (640 * 1024) - (uint)a; + p = sbrk(amt); if(p != a){ printf(stdout, "sbrk test failed 640K test, p %x a %x\n", p, a); exit(); } - char *lastaddr = (char *)(640 * 1024 - 1); + lastaddr = (char*)(640 * 1024 - 1); *lastaddr = 99; // is one forbidden from allocating more than 640K? c = sbrk(4096); - if(c != (char *) 0xffffffff){ + if(c != (char*)0xffffffff){ printf(stdout, "sbrk allocated more than 640K, c %x\n", c); exit(); } @@ -1287,7 +1292,7 @@ sbrktest(void) // can one de-allocate? a = sbrk(0); c = sbrk(-4096); - if(c == (char *) 0xffffffff){ + if(c == (char*)0xffffffff){ printf(stdout, "sbrk could not deallocate\n"); exit(); } @@ -1311,15 +1316,15 @@ sbrktest(void) } c = sbrk(4096); - if(c != (char *) 0xffffffff){ + if(c != (char*)0xffffffff){ printf(stdout, "sbrk was able to re-allocate beyond 640K, c %x\n", c); exit(); } // can we read the kernel's memory? - for(a = (char*)(640*1024); a < (char *)2000000; a += 50000){ - int ppid = getpid(); - int pid = fork(); + for(a = (char*)(640*1024); a < (char*)2000000; a += 50000){ + ppid = getpid(); + pid = fork(); if(pid < 0){ printf(stdout, "fork failed\n"); exit(); @@ -1332,6 +1337,38 @@ sbrktest(void) wait(); } + // if we run the system out of memory, does it clean up the last + // failed allocation? + sbrk(-(sbrk(0) - oldbrk)); + if(pipe(fds) != 0){ + printf(1, "pipe() failed\n"); + exit(); + } + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + if((pids[i] = fork()) == 0){ + // allocate the full 640K + sbrk((640 * 1024) - (uint)sbrk(0)); + write(fds[1], "x", 1); + // sit around until killed + for(;;) sleep(1000); + } + if(pids[i] != -1) + read(fds[0], &scratch, 1); + } + // if those failed allocations freed up the pages they did allocate, + // we'll be able to allocate here + c = sbrk(4096); + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + if(pids[i] == -1) + continue; + kill(pids[i]); + wait(); + } + if(c == (char*)0xffffffff){ + printf(stdout, "failed sbrk leaked memory\n"); + exit(); + } + if(sbrk(0) > oldbrk) sbrk(-(sbrk(0) - oldbrk)); @@ -1339,26 +1376,89 @@ 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(); + 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, pid; + uint p; + + printf(stdout, "validate test\n"); + hi = 1100*1024; + + for(p = 0; p <= (uint)hi; p += 4096){ + 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(); + } } + + printf(stdout, "validate ok\n"); +} + +// does unintialized data start out zero? +char uninit[10000]; +void +bsstest(void) +{ + int i; + + printf(stdout, "bss test\n"); + for(i = 0; i < sizeof(uninit); i++){ + if(uninit[i] != '\0'){ + printf(stdout, "bss test failed\n"); + exit(); + } + } + printf(stdout, "bss test ok\n"); +} + +// does exec do something sensible if the arguments +// are larger than a page? +void +bigargtest(void) +{ + int pid, ppid; + + ppid = getpid(); + pid = fork(); if(pid == 0){ - // should cause a trap: - p[-4096] = 'z'; - kill(ppid); - printf(stdout, "stack test failed: page before stack was writeable\n"); + char *args[32+1]; + int i; + for(i = 0; i < 32; i++) + args[i] = "bigargs test: failed\n "; + args[32] = 0; + printf(stdout, "bigarg test\n"); + exec("echo", args); + printf(stdout, "bigarg test ok\n"); + exit(); + } else if(pid < 0){ + printf(stdout, "bigargtest: fork failed\n"); exit(); } wait(); - printf(stdout, "stack test OK\n"); } int @@ -1372,8 +1472,10 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); - stacktest(); + bigargtest(); + bsstest(); sbrktest(); + validatetest(); opentest(); writetest(); |