Skip to content

Commit

Permalink
[std::io::Chain] Mark first as done only when reading into non-zero l…
Browse files Browse the repository at this point in the history
…ength buffer.

Fixes #36771.
  • Loading branch information
tmiasko committed Sep 27, 2016
1 parent 8467e8d commit 26f9949
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/libstd/io/mod.rs
Expand Up @@ -1432,7 +1432,7 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
if !self.done_first {
match self.first.read(buf)? {
0 => { self.done_first = true; }
0 if buf.len() != 0 => { self.done_first = true; }
n => return Ok(n),
}
}
Expand Down Expand Up @@ -1959,6 +1959,17 @@ mod tests {
cmp_bufread(chain1, chain2, &testdata[..]);
}

#[test]
fn chain_zero_length_read_is_not_eof() {
let a = b"A";
let b = b"B";
let mut s = String::new();
let mut chain = (&a[..]).chain(&b[..]);
chain.read(&mut []).unwrap();
chain.read_to_string(&mut s).unwrap();
assert_eq!("AB", s);
}

#[bench]
fn bench_read_to_end(b: &mut test::Bencher) {
b.iter(|| {
Expand Down

0 comments on commit 26f9949

Please sign in to comment.