summaryrefslogtreecommitdiff
path: root/usertests.c
diff options
context:
space:
mode:
Diffstat (limited to 'usertests.c')
-rw-r--r--usertests.c210
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();