Finding
parse_caps_xml() (line 241) deserializes untrusted indexer caps XML directly into the self-referential CapsCategory (subcategories: Vec), and serde's recursive-descent deserializer overflows the stack during parsing itself (~200KB of nested aborts the process on tokio's 2MiB worker stacks) before the iterative post-parse conversion ever runs — reachable via test_indexer/refresh_caps against any added indexer.
Evidence
crates/zetesis/src/client/xml.rs:241. Surfaced by the 2026-07-03 deep-audit workflow (adversarially verified + Opus-judged).
Why this matters
A ~200KB crafted indexer caps response crashes the whole process via stack overflow, reachable through ordinary refresh_caps/test_indexer flows — a trivial remote DoS against any configured indexer.
Desired correction
Bound nesting before/at deserialization: either pre-scan the raw XML and reject beyond a max depth, or parse manually with quick_xml's event reader tracking depth and erroring past a cap; the existing convert_category_survives_hostile_nesting_depth test must be extended to feed real deep XML through from_str.
Done when: the defect's failure mode no longer reproduces and a regression test covers it.
Finding
parse_caps_xml() (line 241) deserializes untrusted indexer caps XML directly into the self-referential CapsCategory (subcategories: Vec), and serde's recursive-descent deserializer overflows the stack during parsing itself (~200KB of nested aborts the process on tokio's 2MiB worker stacks) before the iterative post-parse conversion ever runs — reachable via test_indexer/refresh_caps against any added indexer.
Evidence
crates/zetesis/src/client/xml.rs:241. Surfaced by the 2026-07-03 deep-audit workflow (adversarially verified + Opus-judged).Why this matters
A ~200KB crafted indexer caps response crashes the whole process via stack overflow, reachable through ordinary refresh_caps/test_indexer flows — a trivial remote DoS against any configured indexer.
Desired correction
Bound nesting before/at deserialization: either pre-scan the raw XML and reject beyond a max depth, or parse manually with quick_xml's event reader tracking depth and erroring past a cap; the existing convert_category_survives_hostile_nesting_depth test must be extended to feed real deep XML through from_str.
Done when: the defect's failure mode no longer reproduces and a regression test covers it.