mirror of
https://github.com/storytold/designcraft.git
synced 2026-10-27 11:46:51 -06:00
Three commands took a count from their parameters and used it unchecked. Parameters come from MCP, the control channel and scripts, so the count is hostile input (never-crash: cap input-sized allocations, checked arithmetic). - layout.createGuides made one or two guides per row and column with no upper limit: 30 million rows took 1.2 GB, and 2^32 - 1 would exhaust memory, which aborts the process past the command guard. A count over 2^32 wrapped to a small one. Both counts are now capped at 100. - edit.stepAndRepeat multiplied rows by columns as usize. In debug builds the overflow panicked; in release builds 2^32 x 2^32 wraps to 0, passes the 1000-copy limit and starts a grid of 2^64 copies. The product is now checked, and a grid that large falls back to `count` copies like any other grid over 1000. - file.new stored any column count in the page (4 billion, or a wrapped value past 2^32). Page::column_rects builds one rect per column each time the columns are laid out. The count is now clamped to 1..=216, the range layout.marginsAndColumns already uses. Each case has a regression test that failed before the fix. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>