mirror of
https://github.com/storytold/gridcraft.git
synced 2026-10-24 10:46:50 -06:00
Security-sweep findings from the scan at revisionac8da7d4(storytold- gridcraft-agent-findings.json), no longer exploitable on main at72c1d57d. Each change caps work or storage per sheet/part so a hostile file cannot buy unbounded work with ordinary bytes; each has a regression test: - finding 2 (package.rs): a part rejected by the MAX_PART size gate is charged its declared compressed size up front, so a loop of oversized parts still ends the allowance instead of re-entering the package. - finding 4 (xml.rs): elements past the kept-node cap are consumed and dropped instead of kept — parse cost stays linear, memory stops growing with the same input (a small compressed workbook previously asked for gigabytes of declared-sized metadata tree). - finding 10 (records.rs): .remaining() caches the suffix of a shared string's Continue parts, so crossing N Continue records is O(N) instead of O(N^2) in records scanned per character. - finding 9 (xls shared formulas): the SHRFMLA master template is parsed once and re-emitted per dependent cell instead of decoded and reprinted for every referencing cell. - findings 3, 6, 8 (sheet_read.rs): hyperlink-cell expansion, conditional- format kept range cells and dynamic-array (deleted-spill) checks are capped with one import warning each instead of the compact-workbook multi-gigabyte allocation or the scanned-per-cell cost. - finding 31 (core/parse.rs): datetime recognition no longer reparses a prefix at every space with a time-shaped tail; an all-digit field length is gated before the derivation machinery runs, staying linear in the text. 🤖 Generated with Codebuff Co-authored-by: Codebuff <noreply@codebuff.com>