]> Devi Nivas Git - cs3210-lab1.git/commitdiff
Remove the stack guard page. Processes are now contiguous from 0 to proc->sz, which...
authorAustin Clements <amdragon@mit.edu>
Wed, 1 Sep 2010 20:46:37 +0000 (16:46 -0400)
committerAustin Clements <amdragon@mit.edu>
Wed, 1 Sep 2010 20:46:37 +0000 (16:46 -0400)
exec.c
syscall.c
usertests.c

diff --git a/exec.c b/exec.c
index 39530aaf08b179efa1aa3b327227359722cdc462..c518c04545bf7267e95224c754930b3d92d5aa94 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -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);
index 9296cffd5cd0e1fa5a394c71ce7bb33951d36a40..f8aeae74807ae8230ea0b9f9a85f62a95c913299 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -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.
@@ -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;
 }
 
index 946565facb856899384f6226cbd7c3aec8aa88a4..77495bfb4cd5f7e9570616b63ff6f1044dc63171 100644 (file)
@@ -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];
@@ -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
@@ -1408,8 +1430,8 @@ main(int argc, char *argv[])
   }
   close(open("usertests.ran", O_CREATE));
 
-  stacktest();
   sbrktest();
+  validatetest();
 
   opentest();
   writetest();