about summary refs log tree commit diff
path: root/library/std/src/io/impls.rs
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2023-10-09 14:25:31 +0100
committerKornel <kornel@geekhood.net>2024-01-29 23:53:09 +0000
commit03545161e68c1b8c3fe052243e372ee75e4ec513 (patch)
tree4e3c84a0b5849e3f54230fe6903dd82f68b9739a /library/std/src/io/impls.rs
parentaf08c64e3800fd15f0afdb8651de8fa7dacc0026 (diff)
downloadrust-03545161e68c1b8c3fe052243e372ee75e4ec513.tar.gz
rust-03545161e68c1b8c3fe052243e372ee75e4ec513.zip
Handle out of memory errors in io:Read::read_to_end()
Diffstat (limited to 'library/std/src/io/impls.rs')
-rw-r--r--library/std/src/io/impls.rs5
1 files changed, 3 insertions, 2 deletions
diff --git a/library/std/src/io/impls.rs b/library/std/src/io/impls.rs
index d8c8d933eb4..557e64dc867 100644
--- a/library/std/src/io/impls.rs
+++ b/library/std/src/io/impls.rs
@@ -303,8 +303,9 @@ impl Read for &[u8] {
 
     #[inline]
     fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
-        buf.extend_from_slice(*self);
         let len = self.len();
+        buf.try_reserve(len).map_err(|_| ErrorKind::OutOfMemory)?;
+        buf.extend_from_slice(*self);
         *self = &self[len..];
         Ok(len)
     }
@@ -451,7 +452,7 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
     fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
         // The total len is known upfront so we can reserve it in a single call.
         let len = self.len();
-        buf.reserve(len);
+        buf.try_reserve(len).map_err(|_| ErrorKind::OutOfMemory)?;
 
         let (front, back) = self.as_slices();
         buf.extend_from_slice(front);