diff --git a/syscall/fs.rs b/syscall/fs.rs
index 1ffb91e7b82bd7db397d3a0afdfe3192508035db..25735e41242f1eb54f1fe345e570ae07f2250065 100644
--- a/syscall/fs.rs
+++ b/syscall/fs.rs
@@ -5,7 +5,12 @@ use super::{Error, Result};
 /// Read syscall
 pub fn read(fd: usize, buf: &mut [u8]) -> Result<usize> {
     println!("Read {}: {}", fd, buf.len());
-    Ok(0)
+    if let Some(file) = unsafe { &mut ::context::CONTEXT }.files.get(fd) {
+        println!("{:?}", file);
+        Ok(0)
+    } else {
+        Err(Error::BadFile)
+    }
 }
 
 /// Write syscall
diff --git a/tests/mod.rs b/tests/mod.rs
index fa55c4d5402197d331b3001dbf8d0ff66db0edd2..67e13c94a402e8177f2288655cfe7a3c653ef97c 100644
--- a/tests/mod.rs
+++ b/tests/mod.rs
@@ -1,17 +1,19 @@
 use arch::interrupt::{enable_interrupts, halt};
 
-use syscall;
+use syscall::{self, Error};
 
+/// Test halting
 #[test]
 fn halt_with_interrupts() {
     unsafe {
-        enable_interrupts();
-        halt();
+        //enable_interrupts();
+        //halt();
     }
 }
 
+/// Test stdio
 #[test]
-fn open_stdio() {
+fn stdio() {
     // Test opening stdin
     assert_eq!(syscall::open(b"debug:", 0), Ok(0));
 
@@ -29,3 +31,10 @@ fn open_stdio() {
     let stderr_str = b"STDERR";
     assert_eq!(syscall::write(2, stderr_str), Ok(stderr_str.len()));
 }
+
+/// Test that invalid reads/writes cause errors
+#[test]
+fn invalid_path() {
+    assert_eq!(syscall::read(999, &mut []), Err(Error::BadFile));
+    assert_eq!(syscall::write(999, &[]), Err(Error::BadFile));
+}