From 95b53b91c3de33417da5fbc8a8992cc8bcbacee8 Mon Sep 17 00:00:00 2001 From: 5225225 <5225225@mailbox.org> Date: Mon, 18 Apr 2022 18:22:01 +0100 Subject: [PATCH] Use free_usize instead of a u64::try_from in gif.rs --- src/codecs/gif.rs | 5 +---- src/io/mod.rs | 17 +++++++++++++++-- tests/regression.rs | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) 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!(