XFDF: gracefully ignore invalid Unicode annotation colours (#48)

Use checked string slices when reading annotation colour components. Cover colour and interior-colour imports with a synthetic XFDF regression.

Co-authored-by: storybored379 <storybored379@users.noreply.github.com>
Co-authored-by: OpenAI Codex <noreply@openai.com>
This commit is contained in:
storybored379 2026-10-05 13:36:08 -07:00 committed by GitHub
parent 0447a0fc7b
commit 890ae8d3ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 1 deletions

View File

@ -140,7 +140,7 @@ fn parse_hex(s: &str) -> Option<[f64; 3]> {
if h.len() != 6 {
return None;
}
let p = |i: usize| u8::from_str_radix(&h[i..i + 2], 16).ok().map(|v| f64::from(v) / 255.0);
let p = |i: usize| h.get(i..i + 2).and_then(|s| u8::from_str_radix(s, 16).ok()).map(|v| f64::from(v) / 255.0);
Some([p(0)?, p(2)?, p(4)?])
}

View File

@ -204,3 +204,15 @@ fn data_files_merge_into_a_spreadsheet() {
assert!(lines[3].starts_with("\"Grace \"\"Amazing\"\" Hopper, RADM\",Off,"), "{csv}");
assert_eq!(data_values(b"not data"), Err(DataError::UnknownFormat));
}
#[test]
fn unicode_annotation_colours_are_ignored_without_panicking() {
for attr in ["color", "interior-color"] {
let mut doc = blank();
let xml = format!(
r##"<xfdf xmlns="http://ns.adobe.com/xfdf/"><annots><square page="0" rect="10,10,50,50" name="unicode-colour" {attr}="#€€" /></annots></xfdf>"##
);
let report = import(&mut doc, xml.as_bytes()).unwrap();
assert_eq!(report.comments, 1);
}
}