From 191b7d69fd13e2242f634613e6793d42afae53d7 Mon Sep 17 00:00:00 2001 From: Mykhailo Chalyi Date: Wed, 27 May 2026 23:03:11 -0500 Subject: [PATCH] fix(rg): cap json context event fanout --- crates/bashkit/src/builtins/rg/mod.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/bashkit/src/builtins/rg/mod.rs b/crates/bashkit/src/builtins/rg/mod.rs index 8aa0da902..50de4a25b 100644 --- a/crates/bashkit/src/builtins/rg/mod.rs +++ b/crates/bashkit/src/builtins/rg/mod.rs @@ -41,6 +41,7 @@ pub struct Rg; /// `--replace` path against memory amplification from attacker-controlled /// replacement text combined with many matches (TM-DOS-RG-REPLACE). const RG_MAX_REPLACEMENT_OUTPUT_BYTES: usize = 1_048_576; +const RG_MAX_JSON_CONTEXT_EVENTS: usize = 100_000; struct RgOptions { patterns: Vec, @@ -5402,6 +5403,12 @@ impl Builtin for Rg { } } } + if context_lines.len() > RG_MAX_JSON_CONTEXT_EVENTS { + return Ok(ExecResult::err( + "rg: too many JSON context events (output capped)\n".to_string(), + 2, + )); + } if context_lines.is_empty() { for &mat in &matches { write_rg_json_multiline_match( @@ -5833,6 +5840,12 @@ impl Builtin for Rg { } } } + if context_lines.len() > RG_MAX_JSON_CONTEXT_EVENTS { + return Ok(ExecResult::err( + "rg: too many JSON context events (output capped)\n".to_string(), + 2, + )); + } if context_lines.is_empty() { for &line_idx in &match_lines { write_rg_json_match(