Skip to content
/ rust Public
forked from rust-lang/rust

Commit 9091cf4

Browse files
authored
Rollup merge of rust-lang#137832 - wgwoods:fix-bufreader-peek, r=joboet
Fix crash in BufReader::peek() `bufreader_peek` tracking issue: rust-lang#128405 This fixes a logic error in `Buffer::read_more()` that would make `BufReader::peek()` expose uninitialized data and/or segfault if `read_more()` was called with a partially-full buffer and a non-empty inner reader.
2 parents 3893035 + 6d07144 commit 9091cf4

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

library/std/src/io/buffered/bufreader.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,16 @@ impl<R: Read + ?Sized> BufReader<R> {
118118
/// #![feature(bufreader_peek)]
119119
/// use std::io::{Read, BufReader};
120120
///
121-
/// let mut bytes = &b"oh, hello"[..];
121+
/// let mut bytes = &b"oh, hello there"[..];
122122
/// let mut rdr = BufReader::with_capacity(6, &mut bytes);
123123
/// assert_eq!(rdr.peek(2).unwrap(), b"oh");
124124
/// let mut buf = [0; 4];
125125
/// rdr.read(&mut buf[..]).unwrap();
126126
/// assert_eq!(&buf, b"oh, ");
127-
/// assert_eq!(rdr.peek(2).unwrap(), b"he");
127+
/// assert_eq!(rdr.peek(5).unwrap(), b"hello");
128128
/// let mut s = String::new();
129129
/// rdr.read_to_string(&mut s).unwrap();
130-
/// assert_eq!(&s, "hello");
130+
/// assert_eq!(&s, "hello there");
131131
/// assert_eq!(rdr.peek(1).unwrap().len(), 0);
132132
/// ```
133133
#[unstable(feature = "bufreader_peek", issue = "128405")]

library/std/src/io/buffered/bufreader/buffer.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ impl Buffer {
109109

110110
/// Read more bytes into the buffer without discarding any of its contents
111111
pub fn read_more(&mut self, mut reader: impl Read) -> io::Result<usize> {
112-
let mut buf = BorrowedBuf::from(&mut self.buf[self.pos..]);
113-
let old_init = self.initialized - self.pos;
112+
let mut buf = BorrowedBuf::from(&mut self.buf[self.filled..]);
113+
let old_init = self.initialized - self.filled;
114114
unsafe {
115115
buf.set_init(old_init);
116116
}

0 commit comments

Comments
 (0)