From d4ad1b8f06ecb6d4a1d321c66b2b589ad702afcd Mon Sep 17 00:00:00 2001 From: Ivan Miletic Date: Wed, 30 Sep 2026 14:34:30 +0200 Subject: [PATCH] fix: prevent self-referencing $ in graph expression nodes from overflowing the stack --- core/engine/src/nodes/expression/mod.rs | 4 ++++ core/engine/src/workspace/graph/analysis.rs | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/engine/src/nodes/expression/mod.rs b/core/engine/src/nodes/expression/mod.rs index c47cc680..40fd46ed 100644 --- a/core/engine/src/nodes/expression/mod.rs +++ b/core/engine/src/nodes/expression/mod.rs @@ -39,6 +39,10 @@ impl NodeHandler for ExpressionNodeHandler { .with_node_context(&ctx, |_| { format!(r#"Failed to evaluate expression: "{}""#, &expression.value) })?; + let value = match expression.value.contains('$') { + true => value.deep_clone(), + false => value, + }; ctx.trace(|trace| { trace.insert( Rc::from(&*expression.key), diff --git a/core/engine/src/workspace/graph/analysis.rs b/core/engine/src/workspace/graph/analysis.rs index f019e9c3..eb5c7ef8 100644 --- a/core/engine/src/workspace/graph/analysis.rs +++ b/core/engine/src/workspace/graph/analysis.rs @@ -795,7 +795,7 @@ impl<'a> GraphAnalyzer<'a> { let row_scope = Self::scope_with( scope, &[ - ("$", dollar.shallow_clone()), + ("$", dollar.depth_clone(usize::MAX)), (NODES_KEY, self.nodes_scope.shallow_clone()), ], ); @@ -807,6 +807,7 @@ impl<'a> GraphAnalyzer<'a> { ExpressionKind::Standard, &row_scope, ); + let resolved = resolved.depth_clone(usize::MAX); output.insert_at_path(&row.key, &resolved, true); dollar.insert_at_path(&row.key, &resolved, true); row_types.insert(row.id.clone(), resolved);