diff --git a/crates/svg/src/tree.rs b/crates/svg/src/tree.rs index ed49f8ef0..ec0c594bd 100644 --- a/crates/svg/src/tree.rs +++ b/crates/svg/src/tree.rs @@ -269,6 +269,7 @@ pub fn height(xml: &roxmltree::Document<'_>, most: usize) -> Result ImageUsage { ImageUsage { @@ -427,9 +435,20 @@ fn embedded(used: &Used, limits: &Limits, data: &[u8], options: &usvg::Options<' return None; } }; + let Some(xml_depth) = height(&xml, limits.depth).ok().flatten() else { + used.svg_limit.fetch_add(1, Ordering::Relaxed); + return None; + }; + let total_depth = used.xml_depth.load(Ordering::Relaxed).checked_add(xml_depth); + let Some(total_depth) = total_depth.filter(|depth| *depth <= limits.depth) else { + used.svg_limit.fetch_add(1, Ordering::Relaxed); + return None; + }; + let previous_depth = used.xml_depth.swap(total_depth, Ordering::Relaxed); let depth = used.depth.fetch_add(1, Ordering::Relaxed).saturating_add(1); used.svg_depth.fetch_max(depth, Ordering::Relaxed); let tree = usvg::Tree::from_xmltree(&xml, options); + used.xml_depth.store(previous_depth, Ordering::Relaxed); used.depth.fetch_sub(1, Ordering::Relaxed); match tree { Ok(tree) => {