From c304a3cc136d69952fe0f50bfaaf04f9762171c8 Mon Sep 17 00:00:00 2001 From: Maria Pospelova Date: Tue, 3 Mar 2026 10:50:27 +0000 Subject: [PATCH 1/2] Upgrade Group4Reader dimensions from u16 to u32 --- src/decoder/stream.rs | 6 +++--- tests/decode_images.rs | 21 +++++++++++++++++++++ tests/images/big_g4.tif | Bin 0 -> 8338 bytes 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 tests/images/big_g4.tif diff --git a/src/decoder/stream.rs b/src/decoder/stream.rs index e12ac4e..cf67d5d 100644 --- a/src/decoder/stream.rs +++ b/src/decoder/stream.rs @@ -260,9 +260,9 @@ impl Read for PackBitsReader { pub struct Group4Reader { decoder: fax34::decoder::Group4Decoder>>>, line_buf: io::Cursor>, - height: u16, + height: u32, width: u16, - y: u16, + y: u32, } #[cfg(feature = "fax")] @@ -273,7 +273,7 @@ impl Group4Reader { compressed_length: u64, ) -> crate::TiffResult { let width = u16::try_from(dimensions.0)?; - let height = u16::try_from(dimensions.1)?; + let height = dimensions.1; Ok(Self { decoder: fax34::decoder::Group4Decoder::new( diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 5448686..84979d8 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -720,3 +720,24 @@ fn extra_bits_gray() { fn extra_bits_rgb() { test_image_sum_u8("extra_bits_rgb_8b.tiff", ColorType::RGB(8), 0); } + + +#[test] +#[cfg(feature = "fax")] +fn test_decode_huge_g4() { + let path = PathBuf::from(TEST_IMAGE_DIR).join("big_g4.tif"); + let img_file = File::open(path).expect("failed to open large G4 test image"); + let mut decoder = tiff::decoder::Decoder::new(img_file).expect("failed to create decoder"); + + let (width, height) = decoder.dimensions().expect("failed to get dimensions"); + + assert!(height > u16::MAX as u32, "Test image height {} is not large enough to test u16 overflow", height); + + let result = decoder.read_image().expect("failed to decode huge G4 image"); + + if let tiff::decoder::DecodingResult::U8(data) = result { + assert_eq!(data.len(), (width as usize * height as usize)); + } else { + panic!("Unexpected decoding result type"); + } +} \ No newline at end of file diff --git a/tests/images/big_g4.tif b/tests/images/big_g4.tif new file mode 100644 index 0000000000000000000000000000000000000000..2b3e7386aa50be5457dcf9861997bd75731a0b6f GIT binary patch literal 8338 zcmeIuF$#b%5Jb^gBcj-7qm6~NH}O_t>7{i7DRKqj2SS!%vc)^kL(?w390U+R009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q7VWfTp;5T^giF3i-)5+A@clDo Date: Tue, 3 Mar 2026 13:26:09 +0000 Subject: [PATCH 2/2] Fix formatting --- tests/decode_images.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 84979d8..74f9f9f 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -721,7 +721,6 @@ fn extra_bits_rgb() { test_image_sum_u8("extra_bits_rgb_8b.tiff", ColorType::RGB(8), 0); } - #[test] #[cfg(feature = "fax")] fn test_decode_huge_g4() { @@ -730,14 +729,20 @@ fn test_decode_huge_g4() { let mut decoder = tiff::decoder::Decoder::new(img_file).expect("failed to create decoder"); let (width, height) = decoder.dimensions().expect("failed to get dimensions"); - - assert!(height > u16::MAX as u32, "Test image height {} is not large enough to test u16 overflow", height); - let result = decoder.read_image().expect("failed to decode huge G4 image"); + assert!( + height > u16::MAX as u32, + "Test image height {} is not large enough to test u16 overflow", + height + ); + + let result = decoder + .read_image() + .expect("failed to decode huge G4 image"); if let tiff::decoder::DecodingResult::U8(data) = result { assert_eq!(data.len(), (width as usize * height as usize)); } else { panic!("Unexpected decoding result type"); } -} \ No newline at end of file +}