Preventing panic when loading some TIFF files

This commit is contained in:
Matteo Paonessa 2024-02-19 09:36:37 +01:00
parent 860ce1b597
commit 0fcdf77452
4 changed files with 35 additions and 7 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "libcaesium" name = "libcaesium"
version = "0.15.0" version = "0.15.1"
authors = ["Matteo Paonessa <matteo.paonessa@gmail.com>"] authors = ["Matteo Paonessa <matteo.paonessa@gmail.com>"]
edition = "2021" edition = "2021"
categories = ["multimedia::images"] categories = ["multimedia::images"]

View File

@ -1,5 +1,6 @@
use std::fs::File; use std::fs::File;
use std::io::{Cursor, Read, Write}; use std::io::{Cursor, Read, Write};
use std::panic;
use image::ImageFormat::Tiff; use image::ImageFormat::Tiff;
use tiff::encoder::colortype::{RGB8, RGBA8}; use tiff::encoder::colortype::{RGB8, RGBA8};
@ -56,12 +57,26 @@ pub fn compress_to_memory(
in_file: Vec<u8>, in_file: Vec<u8>,
parameters: &CSParameters, parameters: &CSParameters,
) -> Result<Vec<u8>, CaesiumError> { ) -> Result<Vec<u8>, CaesiumError> {
let mut image = image::load_from_memory_with_format(in_file.as_slice(), Tiff).map_err(|e| { let decoding_result =
CaesiumError { match panic::catch_unwind(|| image::load_from_memory_with_format(in_file.as_slice(), Tiff))
{
Ok(i) => i,
Err(_) => {
return Err(CaesiumError {
message: "Failed to decode TIFF image".to_string(),
code: 20504,
});
}
};
let mut image = match decoding_result {
Ok(i) => i,
Err(e) => {
return Err(CaesiumError {
message: e.to_string(), message: e.to_string(),
code: 20504, code: 20504,
})
} }
})?; };
if parameters.width > 0 || parameters.height > 0 { if parameters.width > 0 || parameters.height > 0 {
image = resize_image(image, parameters.width, parameters.height); image = resize_image(image, parameters.width, parameters.height);

BIN
tests/samples/panic.tif Normal file

Binary file not shown.

View File

@ -209,3 +209,16 @@ fn unsupported() {
&params, &params,
).is_err()); ).is_err());
} }
#[test]
fn prevent_panic() {
let output = "tests/samples/output/panic.tif";
initialize(output);
let mut params = caesium::initialize_parameters();
params.tiff.algorithm = caesium::tiff::TiffCompression::Lzw;
assert!(caesium::compress(
String::from("tests/samples/unsupported.tif"),
String::from(output),
&params,
).is_err());
}