mirror of
https://github.com/storytold/wordcraft.git
synced 2026-10-28 20:37:10 -06:00
Audit finding 35: Table::cols() added a deserialized row's grid_after (u32) unchecked, and layout_table sized its column vectors from it, so a small native JSON document could ask for a 16 GB grid (and overflow the sum on 32-bit wasm). Row::grid_after() now clamps to MAX_COLS as first_grid() does and the importer does; cols() sums with saturating adds; layout reads the bounded value. Test: tests_budget::a_huge_grid_after_is_bounded_like_the_docx_readers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>