Skip to content

Commit e49cd1c

Browse files
committed
TryReserveError to ErrorKind::OutOfMemory
1 parent 1d447a9 commit e49cd1c

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

library/std/src/io/error.rs

+12
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ impl From<alloc::ffi::NulError> for Error {
8383
}
8484
}
8585

86+
#[stable(feature = "io_error_from_try_reserve", since = "CURRENT_RUSTC_VERSION")]
87+
impl From<alloc::collections::TryReserveError> for Error {
88+
/// Converts `TryReserveError` to an error with [`ErrorKind::OutOfMemory`].
89+
///
90+
/// `TryReserveError` won't be available as the error `source()`,
91+
/// but this may change in the future.
92+
fn from(_: alloc::collections::TryReserveError) -> Error {
93+
// ErrorData::Custom allocates, which isn't great for handling OOM errors.
94+
ErrorKind::OutOfMemory.into()
95+
}
96+
}
97+
8698
// Only derive debug in tests, to make sure it
8799
// doesn't accidentally get printed.
88100
#[cfg_attr(test, derive(Debug))]

library/std/src/io/tests.rs

+10
Original file line numberDiff line numberDiff line change
@@ -692,3 +692,13 @@ fn read_buf_full_read() {
692692

693693
assert_eq!(BufReader::new(FullRead).fill_buf().unwrap().len(), DEFAULT_BUF_SIZE);
694694
}
695+
696+
#[test]
697+
// 64-bit only to be sure the allocator will fail fast on an impossible to satsify size
698+
#[cfg(target_pointer_width = "64")]
699+
fn try_oom_error() {
700+
let mut v = Vec::<u8>::new();
701+
let reserve_err = v.try_reserve(isize::MAX as usize - 1).unwrap_err();
702+
let io_err = io::Error::from(reserve_err);
703+
assert_eq!(io::ErrorKind::OutOfMemory, io_err.kind());
704+
}

0 commit comments

Comments
 (0)