Skip to content

Commit c36d91c

Browse files
author
André Vicente Milack
committed
Fix buffer invalidation at BufReader.read_vectored
1 parent 96e361f commit c36d91c

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

src/libstd/io/buffered.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,13 @@ impl<R: Read> BufReader<R> {
191191
/// ```
192192
#[stable(feature = "rust1", since = "1.0.0")]
193193
pub fn into_inner(self) -> R { self.inner }
194+
195+
/// Invalidates all data in the internal buffer.
196+
#[inline]
197+
fn discard_buffer(&mut self) {
198+
self.pos = 0;
199+
self.cap = 0;
200+
}
194201
}
195202

196203
impl<R: Seek> BufReader<R> {
@@ -225,9 +232,7 @@ impl<R: Read> Read for BufReader<R> {
225232
// (larger than our internal buffer), bypass our internal buffer
226233
// entirely.
227234
if self.pos == self.cap && buf.len() >= self.buf.len() {
228-
// Empty the buffer
229-
self.cap = 0;
230-
self.pos = 0;
235+
self.discard_buffer();
231236
return self.inner.read(buf);
232237
}
233238
let nread = {
@@ -241,6 +246,7 @@ impl<R: Read> Read for BufReader<R> {
241246
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
242247
let total_len = bufs.iter().map(|b| b.len()).sum::<usize>();
243248
if self.pos == self.cap && total_len >= self.buf.len() {
249+
self.discard_buffer();
244250
return self.inner.read_vectored(bufs);
245251
}
246252
let nread = {
@@ -326,18 +332,14 @@ impl<R: Seek> Seek for BufReader<R> {
326332
} else {
327333
// seek backwards by our remainder, and then by the offset
328334
self.inner.seek(SeekFrom::Current(-remainder))?;
329-
// Empty the buffer
330-
self.cap = 0;
331-
self.pos = 0;
335+
self.discard_buffer();
332336
result = self.inner.seek(SeekFrom::Current(n))?;
333337
}
334338
} else {
335339
// Seeking with Start/End doesn't care about our buffer length.
336340
result = self.inner.seek(pos)?;
337341
}
338-
// Empty the buffer
339-
self.cap = 0;
340-
self.pos = 0;
342+
self.discard_buffer();
341343
Ok(result)
342344
}
343345
}

0 commit comments

Comments
 (0)