From e9c539a488a5b59293b24701b8f121fb7fae1636 Mon Sep 17 00:00:00 2001 From: "Q.P.Liu" Date: Fri, 7 Feb 2014 21:50:49 -0800 Subject: [PATCH 1/2] Fix infinite loop in MemReader::read_until. --- src/libstd/io/mem.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libstd/io/mem.rs b/src/libstd/io/mem.rs index 395ece17eded6..2f0e1e599d98b 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; } } @@ -421,6 +425,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] From 71c88e7f47ff2c250f26f2e4a2742de0028526e5 Mon Sep 17 00:00:00 2001 From: "Q.P.Liu" Date: Sat, 8 Feb 2014 17:53:27 -0800 Subject: [PATCH 2/2] Fix infinite loop in BufReader::read_until. --- src/libstd/io/mem.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libstd/io/mem.rs b/src/libstd/io/mem.rs index 2f0e1e599d98b..363dbd88fb75f 100644 --- a/src/libstd/io/mem.rs +++ b/src/libstd/io/mem.rs @@ -312,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; } } @@ -449,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]