diff --git a/proj2/nachos/userprog/UserProcess.class b/proj2/nachos/userprog/UserProcess.class
index 86d2f3e..63c5cba 100644
Binary files a/proj2/nachos/userprog/UserProcess.class and b/proj2/nachos/userprog/UserProcess.class differ
diff --git a/userprog/UserProcess.java b/userprog/UserProcess.java
index 756acff..7580411 100644
--- a/userprog/UserProcess.java
+++ b/userprog/UserProcess.java
@@ -158,12 +158,8 @@ public class UserProcess {
*/
public int readVirtualMemory(int vaddr, byte[] data, int offset, int length)
{
- //TODO: Boundary checks
- //Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length);
-
byte[] memory = Machine.processor().getMemory();
-
- // for now, just assume that virtual addresses equal physical addresses
+
int vpn=vaddr/pageSize;
if(vaddr<0||vpn>=numPages)
return 0;
@@ -176,7 +172,6 @@ public class UserProcess {
if(amount<=0)
break;
System.arraycopy(memory,pageTable[i].ppn*pageSize+ppn_offs,data,offset,amount);
- //System.arraycopy(data,offset,memory,vaddr,amount);
offset+=amount;
vaddr+=amount;
length-=amount;
@@ -214,16 +209,8 @@ public class UserProcess {
*/
public int writeVirtualMemory(int vaddr, byte[] data, int offset, int length)
{
- //TODO: Boundary checks
- //Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length);
-
byte[] memory = Machine.processor().getMemory();
- // for now, just assume that virtual addresses equal physical addresses
- /*
- if (vaddr < 0 || vaddr >= memory.length)
- return 0;
- */
int vpn=vaddr/pageSize;
if(vaddr<0||vpn>=numPages)
return 0;
@@ -463,6 +450,13 @@ public class UserProcess {
return 0;
}
+ private byte[] bytearray_create_safe(int size)
+ {
+ if(size<0||size>numPages*pageSize)
+ return null;
+ return new byte[size];
+ }
+
/**
* Handle a syscall exception. Called by handleException(). The
* syscall argument identifies which syscall the user executed:
@@ -493,8 +487,6 @@ public class UserProcess {
*/
public int handleSyscall(int syscall, int a0, int a1, int a2, int a3)
{
- //TODO: Bullet-proof?
- //System.out.println("System Call: "+syscall);
String fn;
String[] argz;
byte[] buf;
@@ -513,9 +505,11 @@ public class UserProcess {
fn=readVirtualMemoryString(a0,256);
if(fn!=null&&fn.lastIndexOf('.')!=-1&&fn.substring(fn.lastIndexOf('.')).equals(".coff"))
{
- buf=new byte[8*a1];
+ buf=bytearray_create_safe(4*a1);
+ if(buf==null)
+ return -1;
argz=new String[a1];
- readVirtualMemory(a2,buf,0,8*a1);
+ readVirtualMemory(a2,buf,0,4*a1);
tmp=0;
for(int i=0;i<4*a1;i++)
{
@@ -523,6 +517,8 @@ public class UserProcess {
if(i%4==3)
{
argz[i/4]=readVirtualMemoryString(tmp,256);
+ if(argz[i/4]==null)
+ argz[i/4]=new String();
tmp=0;
}
}
@@ -537,7 +533,6 @@ public class UserProcess {
}
return -1;
}
- System.out.println("Bloody hell");
return -1;
case syscallJoin:
@@ -550,7 +545,6 @@ public class UserProcess {
tmp=UserKernel.process_fin.get(a0);
if(tmp==1)
{
- //Already finished
val=UserKernel.process_return.get(a0);
UserKernel.process_lock.V();
}
@@ -580,11 +574,10 @@ public class UserProcess {
fn=readVirtualMemoryString(a0,256);
if(fn!=null)
{
- //System.out.println("I am going to create a file name "+fn);
OpenFile tf=ThreadedKernel.fileSystem.open(fn,true);
if(tf==null)
return -1;
- for(int i=2;i<16;i++)
+ for(int i=0;i<16;i++)
if(descs[i]==null)
{
descs[i]=tf;
@@ -592,14 +585,12 @@ public class UserProcess {
}
return -1;
}
- System.out.println("Bloody hell");
return -1;
case syscallOpen:
fn=readVirtualMemoryString(a0,256);
if(fn!=null)
{
- //System.out.println("I am going to open a file name "+fn);
OpenFile tf=ThreadedKernel.fileSystem.open(fn,false);
if(tf==null)
return -1;
@@ -611,28 +602,35 @@ public class UserProcess {
}
return -1;
}
- System.out.println("Bloody hell");
return -1;
case syscallRead:
+ if(a0<0||a0>=16)
+ return -1;
if(descs[a0]==null)
return -1;
- buf=new byte[a2];
+ buf=bytearray_create_safe(a2);
+ if(buf==null)
+ return -1;
len=descs[a0].read(buf,0,a2);
if(len<0)
return -1;
return writeVirtualMemory(a1,buf,0,len);
case syscallWrite:
+ if(a0<0||a0>=16)
+ return -1;
if(descs[a0]==null)
return -1;
- buf=new byte[a2];
+ buf=bytearray_create_safe(a2);
+ if(buf==null)
+ return -1;
len=readVirtualMemory(a1,buf,0,a2);
- //return descs[a0].write(buf,0,len);
- len=descs[a0].write(buf,0,len);
- return len;
+ return descs[a0].write(buf,0,len);
case syscallClose:
+ if(a0<0||a0>=16)
+ return -1;
if(descs[a0]!=null)
descs[a0].close();
descs[a0]=null;