From f27ec0f05f2f90ca0291c24a58022b789792c8bf Mon Sep 17 00:00:00 2001 From: Chris Gregory Date: Sat, 25 May 2019 15:02:35 -0500 Subject: [PATCH 1/2] Add test that impl Seek for BufReader correctly invalidates buffer between seeks --- src/libstd/io/buffered.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index e309f81192cf3..3bdb1e34a8b73 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -1162,6 +1162,40 @@ mod tests { assert_eq!(reader.get_ref().pos, expected); } + fn test_buffered_reader_seek_underflow_discard_buffer_between_seeks() { + // gimmick reader that returns Err after first seek + struct ErrAfterFirstSeekReader { + first_seek: bool, + } + impl Read for ErrAfterFirstSeekReader { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + for x in &mut *buf { + *x = 0; + } + Ok(buf.len()) + } + } + impl Seek for ErrAfterFirstSeekReader { + fn seek(&mut self, _: SeekFrom) -> io::Result { + if self.first_seek { + self.first_seek = false; + Ok(0) + } else { + Err(io::Error::new(io::ErrorKind::Other, "oh no!")) + } + } + } + + let mut reader = BufReader::with_capacity(5, ErrAfterFirstSeekReader { first_seek: true }); + assert_eq!(reader.fill_buf().ok(), Some(&[0, 0, 0, 0, 0][..])); + + // The following seek will require two underlying seeks. The first will + // succeed but the second will fail. This should still invalidate the + // buffer. + assert!(reader.seek(SeekFrom::Current(i64::min_value())).is_err()); + assert_eq!(reader.buffer().len(), 0); + } + #[test] fn test_buffered_writer() { let inner = Vec::new(); From b1ae49cae078d472d9ac55168d7bf5e07ff15a40 Mon Sep 17 00:00:00 2001 From: Chris Gregory Date: Sat, 25 May 2019 16:37:38 -0500 Subject: [PATCH 2/2] Annotate test with #[test] --- src/libstd/io/buffered.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 3bdb1e34a8b73..d0e56acc8fb27 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -1162,6 +1162,7 @@ mod tests { assert_eq!(reader.get_ref().pos, expected); } + #[test] fn test_buffered_reader_seek_underflow_discard_buffer_between_seeks() { // gimmick reader that returns Err after first seek struct ErrAfterFirstSeekReader {