BUG-HUNT: [boundary] Potential RecursionError in subgraph cycle detection #1318

Open
opened 2026-04-02 16:49:13 +00:00 by freemo · 0 comments
Owner

Bug Report: [boundary] — Potential RecursionError in subgraph cycle detection

Severity Assessment

  • Impact: A deeply nested subgraph structure could cause a RecursionError, leading to a denial of service.
  • Likelihood: Low. It would require a very complex and deeply nested actor configuration to trigger this.
  • Priority: Low

Location

  • File: src/cleveragents/actor/compiler.py
  • Function/Class: _detect_subgraph_cycles
  • Lines: 160-185

Description

The _detect_subgraph_cycles function uses recursion to detect cycles in subgraphs. If the graph is very deep, this could lead to a RecursionError.

Evidence

def _detect_subgraph_cycles(
    actor_name: str,
    route_nodes: list[NodeDefinition],
    resolver: ActorResolver | None,
    visited: frozenset[str],
) -> list[str]:
    """Detect cycles in subgraph references across actors.

    Returns list of actor names forming a cycle, or empty list.
    """
    if resolver is None:
        return []

    for node in route_nodes:
        if node.type != NodeType.SUBGRAPH:
            continue
        ref_name = node.config.get("actor_ref", "")
        if not ref_name:
            continue
        if ref_name in visited:
            return [*list(visited), ref_name]

        referenced: ActorConfigSchema | None = resolver(ref_name)
        if referenced is None:
            continue
        if referenced.type != ActorType.GRAPH or referenced.route is None:
            continue

        deeper = _detect_subgraph_cycles(
            ref_name,
            referenced.route.nodes,
            resolver,
            visited | {ref_name},
        )
        if deeper:
            return deeper
    return []

Expected Behavior

The function should be able to handle deeply nested graphs without crashing.

Actual Behavior

The function may crash with a RecursionError if the graph is too deep.

Suggested Fix

Rewrite the function to use an iterative approach instead of a recursive one.

Category

boundary

## Bug Report: [boundary] — Potential RecursionError in subgraph cycle detection ### Severity Assessment - **Impact**: A deeply nested subgraph structure could cause a `RecursionError`, leading to a denial of service. - **Likelihood**: Low. It would require a very complex and deeply nested actor configuration to trigger this. - **Priority**: Low ### Location - **File**: `src/cleveragents/actor/compiler.py` - **Function/Class**: `_detect_subgraph_cycles` - **Lines**: 160-185 ### Description The `_detect_subgraph_cycles` function uses recursion to detect cycles in subgraphs. If the graph is very deep, this could lead to a `RecursionError`. ### Evidence ```python def _detect_subgraph_cycles( actor_name: str, route_nodes: list[NodeDefinition], resolver: ActorResolver | None, visited: frozenset[str], ) -> list[str]: """Detect cycles in subgraph references across actors. Returns list of actor names forming a cycle, or empty list. """ if resolver is None: return [] for node in route_nodes: if node.type != NodeType.SUBGRAPH: continue ref_name = node.config.get("actor_ref", "") if not ref_name: continue if ref_name in visited: return [*list(visited), ref_name] referenced: ActorConfigSchema | None = resolver(ref_name) if referenced is None: continue if referenced.type != ActorType.GRAPH or referenced.route is None: continue deeper = _detect_subgraph_cycles( ref_name, referenced.route.nodes, resolver, visited | {ref_name}, ) if deeper: return deeper return [] ``` ### Expected Behavior The function should be able to handle deeply nested graphs without crashing. ### Actual Behavior The function may crash with a `RecursionError` if the graph is too deep. ### Suggested Fix Rewrite the function to use an iterative approach instead of a recursive one. ### Category boundary
freemo self-assigned this 2026-04-02 18:45:23 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core#1318
No description provided.