diff --git a/src/codecs/gif.rs b/src/codecs/gif.rs index 748a445ccf..593c490ba9 100644 --- a/src/codecs/gif.rs +++ b/src/codecs/gif.rs @@ -174,10 +174,7 @@ impl<'a, R: 'a + Read> ImageDecoder<'a> for GifDecoder { let mut frame_buffer = vec![0; buffer_size]; - self.limits.free( - u64::try_from(buffer_size) - .expect("if buffer_size overflows a usize, we should have returned already"), - ); + self.limits.free_usize(buffer_size); self.reader .read_into_buffer(&mut frame_buffer[..]) diff --git a/src/io/mod.rs b/src/io/mod.rs index ff72f8a72d..2cac99a47a 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -1,5 +1,7 @@ //! Input and output of images. +use std::convert::TryFrom; + use crate::{error, ImageError, ImageResult}; pub(crate) mod free_functions; @@ -124,8 +126,6 @@ impl Limits { /// This function acts identically to [`reserve`], but takes a `usize` for convenience. pub fn reserve_usize(&mut self, amount: usize) -> ImageResult<()> { - use std::convert::TryFrom; - match u64::try_from(amount) { Ok(n) => self.reserve(n), Err(_) if self.max_alloc.is_some() => { @@ -149,4 +149,17 @@ impl Limits { *max_alloc = max_alloc.saturating_add(amount); } } + + /// This function acts identically to [`free`], but takes a `usize` for convenience. + pub fn free_usize(&mut self, amount: usize) { + match u64::try_from(amount) { + Ok(n) => self.free(n), + Err(_) if self.max_alloc.is_some() => { + panic!("max_alloc is set, we should have exited earlier when the reserve failed"); + } + Err(_) => { + // Out of bounds, but we weren't asked to consider any limit. + } + } + } } diff --git a/tests/regression.rs b/tests/regression.rs index 5ae0871b38..927447d7a2 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -71,7 +71,7 @@ fn bad_gif_oom() { // It then exits normally with an EOF when reading. // // So instead we look for a limits error (or an unsupported error, for the case that we're - // running these tests without bmp being actually supported) + // running these tests without gif being actually supported) let error = image::load_from_memory(&data).unwrap_err(); assert!(