Skip to content

Commit a338a92

Browse files
authored
Rollup merge of rust-lang#61157 - czipperz:BufReader-Seek-remove-extra-discard_buffer, r=nikomatsakis
BufReader: In Seek impl, remove extra discard_buffer call As far as I can tell, this code does nothing. I'm not sure why it even is there.
2 parents 3520ec3 + b1ae49c commit a338a92

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/libstd/io/buffered.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,41 @@ mod tests {
11621162
assert_eq!(reader.get_ref().pos, expected);
11631163
}
11641164

1165+
#[test]
1166+
fn test_buffered_reader_seek_underflow_discard_buffer_between_seeks() {
1167+
// gimmick reader that returns Err after first seek
1168+
struct ErrAfterFirstSeekReader {
1169+
first_seek: bool,
1170+
}
1171+
impl Read for ErrAfterFirstSeekReader {
1172+
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
1173+
for x in &mut *buf {
1174+
*x = 0;
1175+
}
1176+
Ok(buf.len())
1177+
}
1178+
}
1179+
impl Seek for ErrAfterFirstSeekReader {
1180+
fn seek(&mut self, _: SeekFrom) -> io::Result<u64> {
1181+
if self.first_seek {
1182+
self.first_seek = false;
1183+
Ok(0)
1184+
} else {
1185+
Err(io::Error::new(io::ErrorKind::Other, "oh no!"))
1186+
}
1187+
}
1188+
}
1189+
1190+
let mut reader = BufReader::with_capacity(5, ErrAfterFirstSeekReader { first_seek: true });
1191+
assert_eq!(reader.fill_buf().ok(), Some(&[0, 0, 0, 0, 0][..]));
1192+
1193+
// The following seek will require two underlying seeks. The first will
1194+
// succeed but the second will fail. This should still invalidate the
1195+
// buffer.
1196+
assert!(reader.seek(SeekFrom::Current(i64::min_value())).is_err());
1197+
assert_eq!(reader.buffer().len(), 0);
1198+
}
1199+
11651200
#[test]
11661201
fn test_buffered_writer() {
11671202
let inner = Vec::new();

0 commit comments

Comments
 (0)