From d28963a47ecf74be4a3fc7367740c28c94808aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Fri, 18 Jul 2025 09:31:46 +0200 Subject: [PATCH] Avoid oom situations --- .gitignore | 1 + src/mask.rs | 5 ++++- src/pixmap.rs | 10 ++++------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 0e24d41..46a036e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Cargo.lock .DS_Store /image.png /.vscode +/.idea diff --git a/src/mask.rs b/src/mask.rs index 420a813..8dad32c 100644 --- a/src/mask.rs +++ b/src/mask.rs @@ -192,7 +192,10 @@ impl Mask { let output_buffer_size = reader .output_buffer_size() .ok_or(png::DecodingError::LimitsExceeded)?; - let mut img_data = vec![0; output_buffer_size]; + let mut img_data = Vec::new(); + img_data + .try_reserve_exact(output_buffer_size) + .map_err(|_| make_custom_png_error("failed to reserve output buffer"))?; let info = reader.next_frame(&mut img_data)?; if info.bit_depth != png::BitDepth::Eight { diff --git a/src/pixmap.rs b/src/pixmap.rs index e576ef2..1447f9a 100644 --- a/src/pixmap.rs +++ b/src/pixmap.rs @@ -44,13 +44,11 @@ impl Pixmap { let size = IntSize::from_wh(width, height)?; let data_len = data_len_for_size(size)?; - // We cannot check that allocation was successful yet. - // We have to wait for https://github.com/rust-lang/rust/issues/48043 + let mut data = Vec::new(); + data.try_reserve_exact(data_len).ok()?; + data.resize(data_len, 0); - Some(Pixmap { - data: vec![0; data_len], - size, - }) + Some(Pixmap { data, size }) } /// Creates a new pixmap by taking ownership over an image buffer