about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-02-08 21:16:28 -0800
committerbors <bors@rust-lang.org>2014-02-08 21:16:28 -0800
commit58985e168be7d271cba4d3fd1d95e10ee8839d51 (patch)
tree9f4142e1f32c9e6f4984d6ac13304af3869b745e /src/libstd
parentb66ec3483bd5081bcc829efb88ceb841189b754d (diff)
parent71c88e7f47ff2c250f26f2e4a2742de0028526e5 (diff)
downloadrust-58985e168be7d271cba4d3fd1d95e10ee8839d51.tar.gz
rust-58985e168be7d271cba4d3fd1d95e10ee8839d51.zip
auto merge of #12106 : qpliu/rust/memreader-fill-eof, r=sfackler
I don't know if anything depends on MemReader::fill returning an empty slice instead of EndOfFile, but I'm pretty sure that MemReader::read_until should not go into an infinite loop.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/io/mem.rs20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/libstd/io/mem.rs b/src/libstd/io/mem.rs
index 395ece17ede..363dbd88fb7 100644
--- a/src/libstd/io/mem.rs
+++ b/src/libstd/io/mem.rs
@@ -177,7 +177,11 @@ impl Seek for MemReader {
 
 impl Buffer for MemReader {
     fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
-        Ok(self.buf.slice_from(self.pos))
+        if self.pos < self.buf.len() {
+            Ok(self.buf.slice_from(self.pos))
+        } else {
+            Err(io::standard_error(io::EndOfFile))
+        }
     }
     fn consume(&mut self, amt: uint) { self.pos += amt; }
 }
@@ -308,7 +312,11 @@ impl<'a> Seek for BufReader<'a> {
 
 impl<'a> Buffer for BufReader<'a> {
     fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
-        Ok(self.buf.slice_from(self.pos))
+        if self.pos < self.buf.len() {
+            Ok(self.buf.slice_from(self.pos))
+        } else {
+            Err(io::standard_error(io::EndOfFile))
+        }
     }
     fn consume(&mut self, amt: uint) { self.pos += amt; }
 }
@@ -421,6 +429,10 @@ mod test {
         assert_eq!(reader.read(buf), Ok(3));
         assert_eq!(buf.slice(0, 3), [5, 6, 7]);
         assert!(reader.read(buf).is_err());
+        let mut reader = MemReader::new(~[0, 1, 2, 3, 4, 5, 6, 7]);
+        assert_eq!(reader.read_until(3).unwrap(), ~[0, 1, 2, 3]);
+        assert_eq!(reader.read_until(3).unwrap(), ~[4, 5, 6, 7]);
+        assert!(reader.read(buf).is_err());
     }
 
     #[test]
@@ -441,6 +453,10 @@ mod test {
         assert_eq!(reader.read(buf), Ok(3));
         assert_eq!(buf.slice(0, 3), [5, 6, 7]);
         assert!(reader.read(buf).is_err());
+        let mut reader = BufReader::new(in_buf);
+        assert_eq!(reader.read_until(3).unwrap(), ~[0, 1, 2, 3]);
+        assert_eq!(reader.read_until(3).unwrap(), ~[4, 5, 6, 7]);
+        assert!(reader.read(buf).is_err());
     }
 
     #[test]