Skip to content

Commit c928767

Browse files
committed
default_read_to_end can't try_reserve probe reads
1 parent 356698b commit c928767

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

library/std/src/io/mod.rs

+19-9
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,8 @@ pub(crate) fn default_read_to_end<R: Read + ?Sized>(
430430
loop {
431431
match r.read(&mut probe) {
432432
Ok(n) => {
433+
// there is no way to recover from allocation failure here
434+
// because the data has already been read.
433435
buf.extend_from_slice(&probe[..n]);
434436
return Ok(n);
435437
}
@@ -826,15 +828,23 @@ pub trait Read {
826828
///
827829
/// ```no_run
828830
/// # use std::io;
829-
/// # struct Example; impl Example {
830-
/// # fn read_some_data_for_the_example(&self) -> &'static [u8] { &[] }
831-
/// fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
832-
/// let data_read = self.read_some_data_for_the_example();
833-
///
834-
/// buf.try_reserve(data_read.len()).map_err(|_| io::ErrorKind::OutOfMemory)?;
835-
/// buf.extend_from_slice(data_read);
836-
///
837-
/// Ok(data_read.len())
831+
/// # struct Example { example_datasource: io::Empty } impl Example {
832+
/// # fn get_some_data_for_the_example(&self) -> &'static [u8] { &[] }
833+
/// fn read_to_end(&mut self, dest_vec: &mut Vec<u8>) -> io::Result<usize> {
834+
/// let initial_vec_len = dest_vec.len();
835+
/// loop {
836+
/// let src_buf = self.example_datasource.fill_buf()?;
837+
/// if src_buf.is_empty() {
838+
/// break;
839+
/// }
840+
/// dest_vec.try_reserve(src_buf.len()).map_err(|_| io::ErrorKind::OutOfMemory)?;
841+
/// dest_vec.extend_from_slice(src_buf);
842+
///
843+
/// // Any irreversible side effects should happen after `try_reserve` succeeds,
844+
/// // to avoid losing data on allocation error.
845+
/// self.example_datasource.consume(src_buf.len());
846+
/// }
847+
/// Ok(dest_vec.len() - initial_vec_len)
838848
/// }
839849
/// # }
840850
/// ```

0 commit comments

Comments
 (0)