mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-09 20:00:11 -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>
28 lines
812 B
TOML
28 lines
812 B
TOML
[package]
|
|
name = "wordcraft-doc"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
description = "WordCraft document model: stories, paragraphs, runs, tables, sections, styles, numbering, fields, notes, comments, revisions; edit primitives"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[features]
|
|
# Test inputs other crates' tests share (`cfb_guard::repeating_difat_sample`,
|
|
# `zip_guard::zip64_entry_count_sample`); turned on only as a
|
|
# dev-dependency, so never built into the app.
|
|
test-support = []
|
|
|
|
[dependencies]
|
|
wordcraft-geom = { workspace = true }
|
|
base64 = { workspace = true }
|
|
log = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
unicode-segmentation = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
proptest = { workspace = true }
|