mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-03 08:50:02 -06:00
* #3660: refuse a package that declares too many zip entries before zip parses them zip::ZipArchive::new parses and keeps every central directory header the end record declares before its caller can look at len(). A ZIP64 end record can declare one per 46 bytes of the file: a 47 MB package of one stored file listed 1,000,000 times takes zip 3.0.0 about half a second and a large transient allocation, and len() then says 1, since the copies share a name, so the docx reader's MAX_ENTRIES cap never fires. ODT and spreadsheet packages had no cap at all. wordcraft_doc::zip_guard::check finds the end records the way zip finds them (backwards; the ZIP64 record from the locator's offset on; a plain record when it has no entries or a central header before it) and refuses a package declaring more than the reader's limit. The docx package reader, the ODT reader, the spreadsheet reader (mail-merge data) and the template-title probe call it first, with 20,000 entries as the limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * formats: keep the extensions doc line on EXTENSIONS --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>