From d845ac27dbb263ff331277d5254c4109646f2f26 Mon Sep 17 00:00:00 2001 From: Hendrik Hamerlinck Date: Sun, 23 Nov 2025 12:39:22 +0100 Subject: [PATCH] fix: prevent crashes from SVG rendering --- tiny_skia/src/vector.rs | 17 +++++++++++++++-- wgpu/src/image/vector.rs | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/tiny_skia/src/vector.rs b/tiny_skia/src/vector.rs index ea7de2150b..d673df415b 100644 --- a/tiny_skia/src/vector.rs +++ b/tiny_skia/src/vector.rs @@ -7,7 +7,7 @@ use tiny_skia::Transform; use std::cell::RefCell; use std::collections::hash_map; -use std::fs; +use std::{fs, panic}; use std::sync::Arc; #[derive(Debug)] @@ -168,7 +168,20 @@ impl Cache { tiny_skia::Transform::default() }; - resvg::render(tree, transform, &mut image.as_mut()); + // SVG rendering can panic on malformed or complex vectors. + // We catch panics to prevent crashes and continue gracefully. + let render_result = + panic::catch_unwind(panic::AssertUnwindSafe(|| { + resvg::render(tree, transform, &mut image.as_mut()); + })); + + if render_result.is_err() { + log::warn!( + "SVG rendering panicked for handle ID: {}", + handle.id() + ); + return None; + } if let Some([r, g, b, _]) = key.color { // Apply color filter diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs index 31fb2fa6de..882fb427a2 100644 --- a/wgpu/src/image/vector.rs +++ b/wgpu/src/image/vector.rs @@ -5,7 +5,7 @@ use crate::image::atlas::{self, Atlas}; use resvg::tiny_skia; use resvg::usvg; use rustc_hash::{FxHashMap, FxHashSet}; -use std::fs; +use std::{fs, panic}; use std::sync::Arc; /// Entry in cache corresponding to an svg handle @@ -154,7 +154,20 @@ impl Cache { tiny_skia::Transform::default() }; - resvg::render(tree, transform, &mut img.as_mut()); + // SVG rendering can panic on malformed or complex vectors. + // We catch panics to prevent crashes and continue gracefully. + let render_result = + panic::catch_unwind(panic::AssertUnwindSafe(|| { + resvg::render(tree, transform, &mut img.as_mut()); + })); + + if render_result.is_err() { + log::warn!( + "SVG rendering panicked for handle ID: {}", + handle.id() + ); + return None; + } let mut rgba = img.take();