Skip to content

deps: bump the rust-minor-and-patch group with 3 updates - #11

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/cargo/rust-minor-and-patch-a26d74b7ca
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/cargo/rust-minor-and-patch-a26d74b7ca

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Bumps the rust-minor-and-patch group with 3 updates: encoding_rs, office_oxide and zip.

Updates encoding_rs from 0.8.35 to 0.8.43

Commits

Updates office_oxide from 0.1.15 to 0.1.16

Release notes

Sourced from office_oxide's releases.

v0.1.16 | Every finding of the 2026-09-27 audit — 19 issues, 165 checklist items — plus ten resource-bound defects reported privately, fixed test-first: each with a minimal synthetic document built in code, a test that fails before the fix and passes after. A two-arm sweep of 10,215 unique real Office documents against v0.1.12 then found nine regressions introduced by those fixes; all nine are fixed below, each with its own regression test, and the re-run sweep shows no crash, no timeout, no unintended new failure and no real slowdown.

Added

  • Fuzz targets for the new parsers. fuzz_ooxml_salvage (damaged .docx/.pptx parts), fuzz_default_password (the encryption structures of the opt-in feature) and fuzz_doc_header_fonts (the .doc font table and destroyed-header language), each building a valid container in code around the fuzzer's bytes; the fuzz workflow runs them.

  • The text budget scales down with a small input, and a worksheet has a write limit of its own. A document opened through Document knows the size of its file, and its text is now bounded by the larger of a floor of 64 Mi characters (limits::TEXT_BUDGET_FLOOR_CHARS) and 4,096 characters per input byte (TEXT_BUDGET_CHARS_PER_INPUT_BYTE), and never more than limits::max_text_chars(): a file under 64 KB can no longer produce the whole 256 Mi characters, a larger one is bounded as before, and a lowered limit is still the ceiling for every size. Writing is bounded by one write-memory limit in bytes, limits::max_write_bytes() (default 512 MiB, set_max_memory_bytes), in place of a flat table-cell count, with each cell charged what its format's writer costs: 1,900 bytes for a .docx cell, 650 for a .pptx cell and 170 for a worksheet cell (measured at 100,000 cells: 1,832, 632 and 161). That is about 280,000 .docx cells, 825,000 .pptx cells or 3.1 million worksheet cells; a worksheet, which had no cell bound, is bounded too.

  • Benchmarks re-run with refreshed pins. markitdown 0.1.9 (with its converters installed) and python-calamine 0.9.0 replace the pins in scripts/bench-requirements.txt, and BENCHMARKS.md reports a full re-run (10,386 files, Rust figures the median of three runs) with the April 2026 run kept below it. The harnesses survive a file that kills a competing library (a crash list, a resident-memory watchdog), bench_rust covers .doc and .ppt, results are per library and extension, and bench_native.py times the command-line tools.

  • Opt-in default-password feature: open the files Office protects with its fixed default password. Excel encrypts a workbook that is only structure- or write-protected with the well-known password VelvetSweatshop (some producers use an empty one), so such a file opens without a prompt but was refused here. With the feature, those two passwords, and no other, are tried: the Standard and Agile encryption of an encrypted .docx / .xlsx / .pptx ([MS-OFFCRYPTO] §2.3.4) and the RC4 and RC4 CryptoAPI workbook streams of an .xls ([MS-XLS] §2.2.10). A file that needs a real password is refused exactly as before, and a build without the feature (the default) contains none of this code. Off by default; the primitives (MD5, SHA-1, SHA-2, AES, RC4) come from the RustCrypto crates md-5, sha1, sha2, aes and rc4, which are compiled only with the feature, and the primitives are checked against their published test vectors. The Office schemes built on them are checked against encryptors written in this repository's tests and, over the corpus, against an independent decryptor (17 files open with the same text); no Excel-written CryptoAPI or Standard fixture is in the tests. The feature is opt-in, only decrypts, and is not for protecting anything and not FIPS-validated: the password is public, the code is not constant-time or a validated cryptographic module, and MD5 and RC4 cannot be part of a FIPS 140 build, so a build that must be FIPS-compliant leaves it off. A file it cannot open now says why: it needs a real password, uses an unsupported scheme, or has a damaged encryption header. Of the corpus' 140 encrypted files, 17 (13 distinct documents) open; their text is identical to what an independent decryptor gives. The CLI and MCP crates forward the feature as default-password.

  • Hidden text and tracked deletions can be kept. New process-wide settings read_options::set_include_hidden_text and set_include_deleted_text (and office-oxide --include-hidden / --include-deleted on every command) bring back text a run hides (w:vanish, sprmCFVanish) and text a tracked change deleted (w:del runs and w:cellDel cells, sprmCFRMarkDel), in .docx and .doc, for every output. Both are off by default, so nothing read before changes; text under w:moveFrom stays out because the move's destination carries it.

Added (limits, options and damage)

  • Limits and read settings can belong to one document. New options::ParseOptions (limits: Limits, include_hidden_text, include_deleted_text, on_incomplete), Document::open_with and Document::from_reader_with. The options stay with the document: every conversion (plain_text, to_markdown, to_html, to_ir, the write_* methods) runs under them on whichever thread it is called, packages embedded in the document are read under them, and the process-wide settings other documents read do not change. limits::Limits holds every limit as one value (default(), current(), strict(), unlimited(), apply() to set the process-wide defaults in one call). The set_max_* functions are unchanged.

  • Refuse an incomplete result instead of returning it. options::OnIncomplete::Error (also ParseOptions::strict()) makes open_with return OfficeError::Incomplete when a part could not be read, a limit cut the output, or the file's own structure shows text is missing; the message names the first losses. The default stays Report: the content read, with the loss said in the text and in Metadata::warnings.

  • Document::damage() lists what is wrong with a document as options::Damage { kind, part, detail } (UnreadablePart, Truncated, Recovered), with is_loss() to tell missing content from a repair that left it intact.

  • Per-part size and inflate-ratio limits. limits::set_max_part_bytes (default 512 MiB, the former fixed cap) and limits::set_max_inflate_ratio (default 1,000, applied only to parts larger than 64 MiB so a small, highly compressible part is never refused): a zip-bomb part is refused before it is inflated past either bound. The stored size a header declares is bounded by the room the file's layout leaves that entry, so a header cannot raise its own cap. Document::save_as writes under the document's own limits.

  • The options reach every surface. C interface (office_options_*, office_document_open_with, office_document_open_from_bytes_with, office_document_damage_json, error code OFFICE_ERR_INCOMPLETE = 7), Python (ParseOptions, Document.open(path, options=...), Document.damage(), IncompleteDocumentError), Node (ParseOptions, Document.open(path, options), damage(), error code 7), Go (ParseOptions, OpenWith, OpenFromBytesWith, Document.Damage, IsIncomplete), C# (ParseOptions, Document.Open(path, options), Document.Damage(), OfficeOxideException.IsIncomplete) and WASM (WasmParseOptions, WasmDocument.openWith(bytes, format, options), damage()). ParseOptions::set_option(name, value) and Limits::set(name, value) set an option by name for callers that cannot name a Rust field.

  • CLI: --strict and --limit NAME=VALUE (repeatable; max for none); info lists what is missing.

Changed (memory)

  • A parsed worksheet cell is 56 bytes, not 96. Every cell carried a formula, rich-text runs and a value-metadata index that few cells use; they now live in one boxed extension. Measured over the corpus a parsed cell cost 136-230 bytes, so a 2.4-million-cell sheet is tens of MiB smaller. A test fails if the cell grows past 56 bytes.
  • No extra copies of picture data when writing IR JSON or image-embedding Markdown/HTML. The base64 text of a picture was built as a string, then copied into the output (twice for Markdown); it is now written into the destination as it is produced. DocumentIR::write_json streams the IR into a writer, and DocumentIR::to_json_string (used by the Python and C bindings) sizes its buffer for the pictures instead of growing it by doubling. Output is byte-identical.
  • Measured for the maintainers' planning, not changed here: over the 15,979-file corpus the median document costs 2-3 MiB to open and the 99th percentile is under 15 MiB in every format; the large costs are a handful of image-heavy documents (pictures are decompressed at open, even for text-only output) and workbooks with 100 MB+ of sheet XML held while parsed. Both are tracked for 0.1.17 (#506, #510); the IR's per-cell size (TableCell 304 bytes, Element 296) is tracked for 0.2 (#511) with shared picture bytes (#507).

Changed (the limits surface)

  • Eight limits, not twenty. Twenty independent settings guarded four hazards, which is far more than the libraries this one is compared with expose (Apache POI's ZipSecureFile bounds entry size, inflate ratio and text size; it has three, image::Limits three, libxml2 one switch). The public settings are now grouped by what they guard: the zip layer (part_bytes, package_bytes, package_entries, inflate_ratio), the output (text_chars), embedded packages (embedded_depth, embedded_packages) and one memory budget (memory_bytes, default 1 GiB) from which every bound on copies, padding and writing is derived. The derived bounds keep exactly the defaults they had: pictures copied into one IR (half of the budget, 512 MiB), their total (four times, 4 GiB), a compressed metafile inflated (a quarter), the padding of a sparse .xls sheet (a 64th and a 128th, in cells), the padding of an IR (half, and a sheet's own the whole), what a writer builds (half), and the embedded packages' bytes (a quarter of package_bytes). The Markdown caps and Excel's 32,767-sheet limit are constants. Only set_max_package_entries, set_max_package_bytes and set_max_text_chars existed in 0.1.15, and all three still work; the other setters never shipped. Lowering memory_bytes lowers every derived bound together, so a caller who wants to cap picture bytes alone no longer can.

Changed (limits, options and damage)

  • Source-compatibility notes. xlsx::Cell's formula, rich_runs and vm fields are now the methods formula(), rich_runs() and vm() (set with set_formula, set_rich_runs, set_vm; build a cell with Cell::new); OfficeError is #[non_exhaustive]; XlsError has a new variant, EncryptionNotSupported (an encrypted workbook the reader cannot open now says which scheme); Slide::comments is now the method Slide::comments(); the parts are Slide::comment_parts: Vec<Arc<[SlideComment]>>, each shared by every slide that names it; XlsxDocument and PptxDocument gained public unreadable_* fields (a struct literal needs them); the per-document options are applied by Document only: a format reader called directly (Document::as_docx() and the like) reads under the process-wide settings.

  • MCP server: extract and info read the document under per-call options that cap the text and image budgets, instead of lowering the process-wide budgets and restoring them; they take "strict": true. No lock on the process-wide limits is needed any more.

  • OfficeError is #[non_exhaustive] and has a new variant, Incomplete; match it with a wildcard arm.

  • The default-password feature now uses the RustCrypto crates instead of primitives written in this crate (see above); the feature is still off by default and a default build links none of them.

Fixed

  • The size-scaled text budget and the write limit reach the format readers and writers used directly. DocxDocument, XlsxDocument, PptxDocument, DocDocument, XlsDocument and PptDocument now know the size of their file as Document does, so the text budget scales for them too (it applied only through Document). DocxWriter, PptxWriter and XlsxWriter count the cells they were handed when the document is written and are held to limits::max_memory_bytes as create_from_ir is. A .doc that embeds the same Word document under several names now gives its text once, with a one-line pointer for each repeat, as a .docx does. The README and the language bindings' READMEs quoted the April 2026 benchmark run (6,062 files, "100% pass rate on valid files"); they now quote the October 2026 re-run (10,386 files, 97.3% opened) and the speed-ups it measured (5-10x, not up to 100x).

  • An embedded package named more than once is given once. A .docx that names one embedded package under several entry names, or relates to one part from several places, copied the package's text into the document once per name; a crafted file multiplied it by its number of names. The text is now given where the package first appears and every further name is one line saying so ([embedded package repeated: its text is given where it first appears]), charged to the embedded-package account; the bytes and the package count were already charged once.

  • A .doc whose header is destroyed takes the language of its 8-bit text from the font table. A header whose version is not a Word version lost its language, so the text was read as Windows-1252 and said so. Each font in the font table declares the character set it was chosen for ([MS-DOC] §2.9.102), so the text of a Cyrillic, Greek, Hebrew, Arabic, Baltic, Central European, Turkish, Vietnamese, Thai or East Asian document is now read in the code page of the character set most of its fonts declare, and the warning says where the language came from. A document whose fonts declare none, and every document with an intact header, are read as before.

  • The per-sheet and the document-wide padding allowances are one mechanism. The empty-slot allowance of a .xls and the empty-cell allowance of an .xlsx IR kept their own copies of the same charge-and-spend logic; both are now two instances of one Allowance. No limit, default or message changed. The text-budget default is documented as deliberately flat.

... (truncated)

Changelog

Sourced from office_oxide's changelog.

[0.1.16] - 2026-10-30

Added

  • Fuzz targets for the new parsers. fuzz_ooxml_salvage (damaged .docx/.pptx parts), fuzz_default_password (the encryption structures of the opt-in feature) and fuzz_doc_header_fonts (the .doc font table and destroyed-header language), each building a valid container in code around the fuzzer's bytes; the fuzz workflow runs them.

  • The text budget scales down with a small input, and a worksheet has a write limit of its own. A document opened through Document knows the size of its file, and its text is now bounded by the larger of a floor of 64 Mi characters (limits::TEXT_BUDGET_FLOOR_CHARS) and 4,096 characters per input byte (TEXT_BUDGET_CHARS_PER_INPUT_BYTE), and never more than limits::max_text_chars(): a file under 64 KB can no longer produce the whole 256 Mi characters, a larger one is bounded as before, and a lowered limit is still the ceiling for every size. Writing is bounded by one write-memory limit in bytes, limits::max_write_bytes() (default 512 MiB, set_max_memory_bytes), in place of a flat table-cell count, with each cell charged what its format's writer costs: 1,900 bytes for a .docx cell, 650 for a .pptx cell and 170 for a worksheet cell (measured at 100,000 cells: 1,832, 632 and 161). That is about 280,000 .docx cells, 825,000 .pptx cells or 3.1 million worksheet cells; a worksheet, which had no cell bound, is bounded too.

  • Benchmarks re-run with refreshed pins. markitdown 0.1.9 (with its converters installed) and python-calamine 0.9.0 replace the pins in scripts/bench-requirements.txt, and BENCHMARKS.md reports a full re-run (10,386 files, Rust figures the median of three runs) with the April 2026 run kept below it. The harnesses survive a file that kills a competing library (a crash list, a resident-memory watchdog), bench_rust covers .doc and .ppt, results are per library and extension, and bench_native.py times the command-line tools.

  • Opt-in default-password feature: open the files Office protects with its fixed default password. Excel encrypts a workbook that is only structure- or write-protected with the well-known password VelvetSweatshop (some producers use an empty one), so such a file opens without a prompt but was refused here. With the feature, those two passwords, and no other, are tried: the Standard and Agile encryption of an encrypted .docx / .xlsx / .pptx ([MS-OFFCRYPTO] §2.3.4) and the RC4 and RC4 CryptoAPI workbook streams of an .xls ([MS-XLS] §2.2.10). A file that needs a real password is refused exactly as before, and a build without the feature (the default) contains none of this code. Off by default; the primitives (MD5, SHA-1, SHA-2, AES, RC4) come from the RustCrypto crates md-5, sha1, sha2, aes and rc4, which are compiled only with the feature, and the primitives are checked against their published test vectors. The Office schemes built on them are checked against encryptors written in this repository's tests and, over the corpus, against an independent decryptor (17 files open with the same text); no Excel-written CryptoAPI or Standard fixture is in the tests. The feature is opt-in, only decrypts, and is not for protecting anything and not FIPS-validated: the password is public, the code is not constant-time or a validated cryptographic module, and MD5 and RC4 cannot be part of a FIPS 140 build, so a build that must be FIPS-compliant leaves it off. A file it cannot open now says why: it needs a real password, uses an unsupported scheme, or has a damaged encryption header. Of the corpus' 140 encrypted files, 17 (13 distinct documents) open; their text is identical to what an independent decryptor gives. The CLI and MCP crates forward the feature as default-password.

  • Hidden text and tracked deletions can be kept. New process-wide settings read_options::set_include_hidden_text and set_include_deleted_text (and office-oxide --include-hidden / --include-deleted on every command) bring back text a run hides (w:vanish, sprmCFVanish) and text a tracked change deleted (w:del runs and w:cellDel cells, sprmCFRMarkDel), in .docx and .doc, for every output. Both are off by default, so nothing read before changes; text under w:moveFrom stays out because the move's destination carries it.

Added (limits, options and damage)

  • Limits and read settings can belong to one document. New options::ParseOptions (limits: Limits, include_hidden_text, include_deleted_text, on_incomplete), Document::open_with and Document::from_reader_with. The options stay with the document: every conversion (plain_text, to_markdown, to_html, to_ir, the write_* methods) runs under them on whichever thread it is called, packages embedded in the document are read under them, and the process-wide settings other documents read do not change. limits::Limits holds every limit as one value (default(), current(), strict(), unlimited(), apply() to set the process-wide defaults in one call). The set_max_* functions are unchanged.

  • Refuse an incomplete result instead of returning it. options::OnIncomplete::Error (also ParseOptions::strict()) makes open_with return OfficeError::Incomplete when a part could not be read, a limit cut the output, or the file's own structure shows text is missing; the message names the first losses. The default stays Report: the content read, with the loss said in the text and in Metadata::warnings.

  • Document::damage() lists what is wrong with a document as options::Damage { kind, part, detail } (UnreadablePart, Truncated, Recovered), with is_loss() to tell missing content from a repair that left it intact.

  • Per-part size and inflate-ratio limits. limits::set_max_part_bytes (default 512 MiB, the former fixed cap) and limits::set_max_inflate_ratio (default 1,000, applied only to parts larger than 64 MiB so a small, highly compressible part is never refused): a zip-bomb part is refused before it is inflated past either bound. The stored size a header declares is bounded by the room the file's layout leaves that entry, so a header cannot raise its own cap. Document::save_as writes under the document's own limits.

  • The options reach every surface. C interface (office_options_*, office_document_open_with, office_document_open_from_bytes_with, office_document_damage_json, error code OFFICE_ERR_INCOMPLETE = 7), Python (ParseOptions, Document.open(path, options=...), Document.damage(), IncompleteDocumentError), Node (ParseOptions, Document.open(path, options), damage(), error code 7), Go (ParseOptions, OpenWith, OpenFromBytesWith, Document.Damage, IsIncomplete), C# (ParseOptions, Document.Open(path, options), Document.Damage(), OfficeOxideException.IsIncomplete) and WASM (WasmParseOptions, WasmDocument.openWith(bytes, format, options), damage()). ParseOptions::set_option(name, value) and Limits::set(name, value) set an option by name for callers that cannot name a Rust field.

  • CLI: --strict and --limit NAME=VALUE (repeatable; max for none); info lists what is missing.

Changed (memory)

  • A parsed worksheet cell is 56 bytes, not 96. Every cell carried a formula, rich-text runs and a value-metadata index that few cells use; they now live in one boxed extension. Measured over the corpus a parsed cell cost 136-230 bytes, so a 2.4-million-cell sheet is tens of MiB smaller. A test fails if the cell grows past 56 bytes.
  • No extra copies of picture data when writing IR JSON or image-embedding Markdown/HTML. The base64 text of a picture was built as a string, then copied into the output (twice for Markdown); it is now written into the destination as it is produced. DocumentIR::write_json streams the IR into a writer, and DocumentIR::to_json_string (used by the Python and C bindings) sizes its buffer for the pictures instead of growing it by doubling. Output is byte-identical.
  • Measured for the maintainers' planning, not changed here: over the 15,979-file corpus the median document costs 2-3 MiB to open and the 99th percentile is under 15 MiB in every format; the large costs are a handful of image-heavy documents (pictures are decompressed at open, even for text-only output) and workbooks with 100 MB+ of sheet XML held while parsed. Both are tracked for 0.1.17 (#506, #510); the IR's per-cell size (TableCell 304 bytes, Element 296) is tracked for 0.2 (#511) with shared picture bytes (#507).

Changed (the limits surface)

  • Eight limits, not twenty. Twenty independent settings guarded four hazards, which is far more than the libraries this one is compared with expose (Apache POI's ZipSecureFile bounds entry size, inflate ratio and text size; it has three, image::Limits three, libxml2 one switch). The public settings are now grouped by what they guard: the zip layer (part_bytes, package_bytes, package_entries, inflate_ratio), the output (text_chars), embedded packages (embedded_depth, embedded_packages) and one memory budget (memory_bytes, default 1 GiB) from which every bound on copies, padding and writing is derived. The derived bounds keep exactly the defaults they had: pictures copied into one IR (half of the budget, 512 MiB), their total (four times, 4 GiB), a compressed metafile inflated (a quarter), the padding of a sparse .xls sheet (a 64th and a 128th, in cells), the padding of an IR (half, and a sheet's own the whole), what a writer builds (half), and the embedded packages' bytes (a quarter of package_bytes). The Markdown caps and Excel's 32,767-sheet limit are constants. Only set_max_package_entries, set_max_package_bytes and set_max_text_chars existed in 0.1.15, and all three still work; the other setters never shipped. Lowering memory_bytes lowers every derived bound together, so a caller who wants to cap picture bytes alone no longer can.

Changed (limits, options and damage)

  • Source-compatibility notes. xlsx::Cell's formula, rich_runs and vm fields are now the methods formula(), rich_runs() and vm() (set with set_formula, set_rich_runs, set_vm; build a cell with Cell::new); OfficeError is #[non_exhaustive]; XlsError has a new variant, EncryptionNotSupported (an encrypted workbook the reader cannot open now says which scheme); Slide::comments is now the method Slide::comments(); the parts are Slide::comment_parts: Vec<Arc<[SlideComment]>>, each shared by every slide that names it; XlsxDocument and PptxDocument gained public unreadable_* fields (a struct literal needs them); the per-document options are applied by Document only: a format reader called directly (Document::as_docx() and the like) reads under the process-wide settings.

  • MCP server: extract and info read the document under per-call options that cap the text and image budgets, instead of lowering the process-wide budgets and restoring them; they take "strict": true. No lock on the process-wide limits is needed any more.

  • OfficeError is #[non_exhaustive] and has a new variant, Incomplete; match it with a wildcard arm.

  • The default-password feature now uses the RustCrypto crates instead of primitives written in this crate (see above); the feature is still off by default and a default build links none of them.

Fixed

  • The size-scaled text budget and the write limit reach the format readers and writers used directly. DocxDocument, XlsxDocument, PptxDocument, DocDocument, XlsDocument and PptDocument now know the size of their file as Document does, so the text budget scales for them too (it applied only through Document). DocxWriter, PptxWriter and XlsxWriter count the cells they were handed when the document is written and are held to limits::max_memory_bytes as create_from_ir is. A .doc that embeds the same Word document under several names now gives its text once, with a one-line pointer for each repeat, as a .docx does. The README and the language bindings' READMEs quoted the April 2026 benchmark run (6,062 files, "100% pass rate on valid files"); they now quote the October 2026 re-run (10,386 files, 97.3% opened) and the speed-ups it measured (5-10x, not up to 100x).

  • An embedded package named more than once is given once. A .docx that names one embedded package under several entry names, or relates to one part from several places, copied the package's text into the document once per name; a crafted file multiplied it by its number of names. The text is now given where the package first appears and every further name is one line saying so ([embedded package repeated: its text is given where it first appears]), charged to the embedded-package account; the bytes and the package count were already charged once.

  • A .doc whose header is destroyed takes the language of its 8-bit text from the font table. A header whose version is not a Word version lost its language, so the text was read as Windows-1252 and said so. Each font in the font table declares the character set it was chosen for ([MS-DOC] §2.9.102), so the text of a Cyrillic, Greek, Hebrew, Arabic, Baltic, Central European, Turkish, Vietnamese, Thai or East Asian document is now read in the code page of the character set most of its fonts declare, and the warning says where the language came from. A document whose fonts declare none, and every document with an intact header, are read as before.

... (truncated)

Commits
  • 9cdf9b0 Release v0.1.16 — resource limits per document, damaged-part salvage, opt-in ...
  • bcf0253 fix(doc): continue a vertical merge only over the same columns, and keep the ...
  • 5adaf87 fix(doc): match a vertically merged cell to the one above by column, not by c...
  • c101e34 fix(doc): bound the work of mapping property runs to pieces; count grid edges...
  • c761a69 feat(doc): read tables from Word 6.0/95 files (#470)
  • a942747 fix(doc): keep a nested table inside the cell that holds it (#469)
  • 858d739 feat(ir): expose the paragraph style name on Paragraph for .docx and .doc (#468)
  • 531a406 fix(doc): follow sprmPHugePapx into the Data stream and decode sprmTTableHead...
  • See full diff in compare view

Updates zip from 9.1.0 to 9.1.3

Release notes

Sourced from zip's releases.

v9.1.3

🚀 Features

  • (extra_fields) support 0xd935 Android ZIP alignment extra field (#928) (#1198)

🐛 Bug Fixes

  • (format) record correct 32-bit EOCD offset in ZIP64 archives (#1205)
  • (aes) wipe AES round keys when the cipher is dropped (#1204)
  • (fuzz) treat a comment change in a merged sub-writer as non-streamable (#1188)
  • (aes) zeroize AesCtrZipKeyStream buffer and counter on drop (#1196)
  • (extract) prevent symlink-follow truncation via FILE_FLAG_OPEN_REPARSE_POINT (#1195)
  • (write) drop a stale Unicode Path extra field when copying an entry (#1187)
  • (write) don't leave a stale tail that completes a fake EOCD in the comment (#1186)
  • (write) reject deflate levels below 10 when only zopfli is enabled (#1182)

⚡ Performance

  • (read) accelerate extraction with 64 KiB reusable buffer (#1206)
  • (aes) encrypt AES-CTR counter blocks in batches (#1203)
  • (read) eliminate double allocation by populating IndexMap directly (#1200)
  • (read) preallocate files vector in read_central_header (#1199)

v9.1.1

🐛 Bug Fixes

  • store the raw count instead of a bool (#1174)
  • preserve extra fields in raw_copy_file_touch (#1172)
  • (write) flag a non-ASCII file comment as UTF-8 when writing it (#1160)
  • (write) reject duplicate names in merge_archive, blank stale footers, and add opt-in extra-field validation (#1159)
Changelog

Sourced from zip's changelog.

9.1.3 - 2026-10-27

🚀 Features

  • (extra_fields) support 0xd935 Android ZIP alignment extra field (#928) (#1198)

🐛 Bug Fixes

  • (format) record correct 32-bit EOCD offset in ZIP64 archives (#1205)
  • (aes) wipe AES round keys when the cipher is dropped (#1204)
  • (fuzz) treat a comment change in a merged sub-writer as non-streamable (#1188)
  • (aes) zeroize AesCtrZipKeyStream buffer and counter on drop (#1196)
  • (extract) prevent symlink-follow truncation via FILE_FLAG_OPEN_REPARSE_POINT (#1195)
  • (write) drop a stale Unicode Path extra field when copying an entry (#1187)
  • (write) don't leave a stale tail that completes a fake EOCD in the comment (#1186)
  • (write) reject deflate levels below 10 when only zopfli is enabled (#1182)

⚡ Performance

  • (read) accelerate extraction with 64 KiB reusable buffer (#1206)
  • (aes) encrypt AES-CTR counter blocks in batches (#1203)
  • (read) eliminate double allocation by populating IndexMap directly (#1200)
  • (read) preallocate files vector in read_central_header (#1199)

9.1.2 - 2026-10-26

🐛 Bug Fixes

  • preserve the file kind (normal/directory/symlink) in raw_copy_file_touch (#1179)
  • (write) reject a Unicode Path extra field that would rename the entry (#1177)
  • (extract) prevent following symbolic links during file creation (#1116)

9.1.1 - 2026-10-25

🐛 Bug Fixes

  • store the raw count instead of a bool (#1174)
  • preserve extra fields in raw_copy_file_touch (#1172)
  • (write) flag a non-ASCII file comment as UTF-8 when writing it (#1160)
  • (write) reject duplicate names in merge_archive, blank stale footers, and add opt-in extra-field validation (#1159)
Commits
  • af2ed2a chore: release v9.1.3 (#1185)
  • 019776a perf(read): accelerate extraction with 64 KiB reusable buffer (#1206)
  • 5b5c4a0 fix(format): record correct 32-bit EOCD offset in ZIP64 archives (#1205)
  • 20e809a perf(aes): encrypt AES-CTR counter blocks in batches (#1203)
  • 9865299 fix(aes): wipe AES round keys when the cipher is dropped (#1204)
  • e656c5d perf(read): eliminate double allocation by populating IndexMap directly (#1200)
  • 2431276 perf(read): preallocate files vector in read_central_header (#1199)
  • 09d6a8b ci: Manually update version to 9.1.3 (#1202)
  • f2fe6c4 feat(extra_fields): support 0xd935 Android ZIP alignment extra field (#928) (...
  • 5125442 test(fuzz): tolerate reopen failures once the comment holds an EOCD signature...
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

Bumps the rust-minor-and-patch group with 3 updates: [encoding_rs](https://github.com/hsivonen/encoding_rs), [office_oxide](https://github.com/yfedoseev/office_oxide) and [zip](https://github.com/zip-rs/zip2).


Updates `encoding_rs` from 0.8.35 to 0.8.43
- [Commits](https://github.com/hsivonen/encoding_rs/commits)

Updates `office_oxide` from 0.1.15 to 0.1.16
- [Release notes](https://github.com/yfedoseev/office_oxide/releases)
- [Changelog](https://github.com/yfedoseev/office_oxide/blob/main/CHANGELOG.md)
- [Commits](yfedoseev/office_oxide@v0.1.15...v0.1.16)

Updates `zip` from 9.1.0 to 9.1.3
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](zip-rs/zip2@v9.1.0...v9.1.3)

---
updated-dependencies:
- dependency-name: encoding_rs
  dependency-version: 0.8.43
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-minor-and-patch
- dependency-name: office_oxide
  dependency-version: 0.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-minor-and-patch
- dependency-name: zip
  dependency-version: 9.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Nov 2, 2026
@dependabot @github

dependabot Bot commented on behalf of github Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

Looks like these dependencies are updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this Nov 9, 2026
@dependabot
dependabot Bot deleted the dependabot/cargo/rust-minor-and-patch-a26d74b7ca branch November 9, 2026 14:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants