Skip to content

Commit 619c4fc

Browse files
committed
auto merge of #11022 : spaolacci/rust/0read, r=alexcrichton
Could prevent callers from catching the situation and lead to e.g early iterator terminations (cf. `Reader::read_byte`) since `None` is only to be returned only on EOF.
2 parents d9c0658 + ee887d7 commit 619c4fc

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

src/libstd/io/buffered.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,14 @@ impl<R: Reader> Reader for BufferedReader<R> {
118118
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
119119
let nread = {
120120
let available = self.fill();
121-
if available.len() == 0 {
122-
return None;
123-
}
124121
let nread = num::min(available.len(), buf.len());
125122
vec::bytes::copy_memory(buf, available.slice_to(nread));
126123
nread
127124
};
128125
self.pos += nread;
126+
if nread == 0 && self.inner.eof() && buf.len() != 0 {
127+
return None;
128+
}
129129
Some(nread)
130130
}
131131

@@ -322,6 +322,21 @@ mod test {
322322
fn write(&mut self, _: &[u8]) { }
323323
}
324324

325+
/// A dummy reader intended at testing short-reads propagation.
326+
pub struct ShortReader {
327+
priv lengths: ~[uint],
328+
}
329+
330+
impl Reader for ShortReader {
331+
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
332+
self.lengths.shift_opt()
333+
}
334+
335+
fn eof(&mut self) -> bool {
336+
self.lengths.len() == 0
337+
}
338+
}
339+
325340
#[test]
326341
fn test_buffered_reader() {
327342
let inner = MemReader::new(~[0, 1, 2, 3, 4]);
@@ -475,6 +490,19 @@ mod test {
475490
assert_eq!(it.next(), None);
476491
}
477492

493+
#[test]
494+
fn test_short_reads() {
495+
let inner = ShortReader{lengths: ~[0, 1, 2, 0, 1, 0]};
496+
let mut reader = BufferedReader::new(inner);
497+
let mut buf = [0, 0];
498+
assert_eq!(reader.read(buf), Some(0));
499+
assert_eq!(reader.read(buf), Some(1));
500+
assert_eq!(reader.read(buf), Some(2));
501+
assert_eq!(reader.read(buf), Some(0));
502+
assert_eq!(reader.read(buf), Some(1));
503+
assert_eq!(reader.read(buf), None);
504+
}
505+
478506

479507
#[bench]
480508
fn bench_buffered_reader(bh: &mut Harness) {

0 commit comments

Comments
 (0)