From 4e7d0a62821b7f33456d833ead0ad7affe217191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Mittelst=C3=A4dt?= <62167861+TheGalitube@users.noreply.github.com> Date: Fri, 30 Oct 2026 06:52:49 +0000 Subject: [PATCH] Ignore negative XMP pixel dimensions Found while testing crates/meta/src/xmp.rs:550 Co-Authored-By: GPT-6-Luna --- crates/meta/src/xmp.rs | 4 ++-- crates/meta/src/xmp/tests.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/meta/src/xmp.rs b/crates/meta/src/xmp.rs index 8ca82da01..a174ff43c 100644 --- a/crates/meta/src/xmp.rs +++ b/crates/meta/src/xmp.rs @@ -547,8 +547,8 @@ pub fn parse_xmp(s: &str) -> Result { metering_mode: num("exif:MeteringMode").map(|v| v as u16), white_balance: num("exif:WhiteBalance").map(|v| v as u16), orientation: num("tiff:Orientation").map(|v| v as u16).filter(|v| (1..=8).contains(v)).map(Orientation::from_exif), - width: num("tiff:ImageWidth").or_else(|| num("exif:PixelXDimension")).map(|v| v as u32), - height: num("tiff:ImageLength").or_else(|| num("exif:PixelYDimension")).map(|v| v as u32), + width: num("tiff:ImageWidth").filter(|v| *v >= 0.0).or_else(|| num("exif:PixelXDimension").filter(|v| *v >= 0.0)).map(|v| v as u32), + height: num("tiff:ImageLength").filter(|v| *v >= 0.0).or_else(|| num("exif:PixelYDimension").filter(|v| *v >= 0.0)).map(|v| v as u32), title: first("dc:title"), caption: first("dc:description"), alt_text: first("Iptc4xmpCore:AltTextAccessibility"), diff --git a/crates/meta/src/xmp/tests.rs b/crates/meta/src/xmp/tests.rs index 3939d2753..bcae5aac8 100644 --- a/crates/meta/src/xmp/tests.rs +++ b/crates/meta/src/xmp/tests.rs @@ -178,6 +178,22 @@ fn non_positive_iso_is_ignored() { assert_eq!(read(r#"exif:ISOSpeedRatings="200""#), Some(200)); } +#[test] +fn negative_xmp_pixel_width_is_ignored() { + let read = |attrs: &str| { + let x = format!( + r#" + + "# + ); + parse_xmp(&x).unwrap().metadata.width + }; + + assert_eq!(read(r#"tiff:ImageWidth="-1""#), None); + assert_eq!(read(r#"tiff:ImageWidth="-1" exif:PixelXDimension="640""#), Some(640)); + assert_eq!(read(r#"exif:PixelXDimension="-1""#), None); +} + #[test] fn malformed_inputs() { assert!(parse_xmp("").is_ok() || parse_xmp("").is_err());