@@ -430,6 +430,8 @@ pub(crate) fn default_read_to_end<R: Read + ?Sized>(
430
430
loop {
431
431
match r. read ( & mut probe) {
432
432
Ok ( n) => {
433
+ // there is no way to recover from allocation failure here
434
+ // because the data has already been read.
433
435
buf. extend_from_slice ( & probe[ ..n] ) ;
434
436
return Ok ( n) ;
435
437
}
@@ -826,15 +828,23 @@ pub trait Read {
826
828
///
827
829
/// ```no_run
828
830
/// # 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)
838
848
/// }
839
849
/// # }
840
850
/// ```
0 commit comments