From a93c66e7947591db60a84bb02c1ddb0238dda4db Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 16 Mar 2026 08:43:56 +0100 Subject: [PATCH] markdown_preview: Prevent stackoverflows in markdown parsing (#51637) Fixes ZED-5TR Release Notes: - Fixed a stack overflow when parsing deeply nested html in markdown files --- Cargo.lock | 1 + crates/markdown_preview/Cargo.toml | 1 + crates/markdown_preview/src/markdown_parser.rs | 3 +++ 3 files changed, 5 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 8d86e9fa9b82978a4309ff4a77dd8388b4626d0b..83606c7414b7ca323001d79a3aed690f2a57f554 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10247,6 +10247,7 @@ dependencies = [ "pretty_assertions", "pulldown-cmark 0.13.0", "settings", + "stacksafe", "theme", "ui", "urlencoding", diff --git a/crates/markdown_preview/Cargo.toml b/crates/markdown_preview/Cargo.toml index 4baa308f1088341aada1eb2917c2133b8df8c143..c72de7274a407c168e7a3cdd7a253070cc6f858a 100644 --- a/crates/markdown_preview/Cargo.toml +++ b/crates/markdown_preview/Cargo.toml @@ -30,6 +30,7 @@ markup5ever_rcdom.workspace = true pretty_assertions.workspace = true pulldown-cmark.workspace = true settings.workspace = true +stacksafe.workspace = true theme.workspace = true ui.workspace = true urlencoding.workspace = true diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index ffd697d0e1bafc2feeccf3a3a7836a224d983860..29ea273f49578bd6ad408a8d57b891f572705c07 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -10,6 +10,7 @@ use language::LanguageRegistry; use markdown::parser::PARSE_OPTIONS; use markup5ever_rcdom::RcDom; use pulldown_cmark::{Alignment, Event, Parser, Tag, TagEnd}; +use stacksafe::stacksafe; use std::{ cell::RefCell, collections::HashMap, mem, ops::Range, path::PathBuf, rc::Rc, sync::Arc, vec, }; @@ -907,6 +908,7 @@ impl<'a> MarkdownParser<'a> { elements } + #[stacksafe] fn parse_html_node( &self, source_range: Range, @@ -1013,6 +1015,7 @@ impl<'a> MarkdownParser<'a> { } } + #[stacksafe] fn parse_paragraph( &self, source_range: Range,