mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-27 03:27:21 -06:00
Fuzzed inputs drove one check-one process to 2-6 GB (the 16 GB CI runner running two of them was killed every night). Three causes, each with a test: - lopdf (bootstrap inspector) sized PNG predictor rows from /Columns before reading data: /Columns 4294967295 allocated two 4 GiB rows. Vendored lopdf 0.45.0 refuses rows longer than the data (and uses saturating row widths); its load-time stream decoding also gets a 256 MiB limit (it had none). - hayro sized a tiling pattern's cell pixmap from /XStep x scale, bounded only by u16: a step far beyond /BBox allocated 2 GB. The vendored patch keeps the cell within 3000 px a side, lowering the resolution instead. - cos decoded cross-reference streams up to the general 1 GiB limit; they now stop at what 8,388,607 objects' rows can hold (~200 MB at most), and the section is reconstructed (logged) instead. On the nightly's seed (41) the worst captured input fell from 6.2 GB to 6 MB, and a 300 s fuzz run had no process above 300 MB (before: many at 2-5 GB). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 lines
895 B
Rust
29 lines
895 B
Rust
/*
|
|
ToUnicode CMaps are special CMaps and thus can be parsed simpler. Assumptions:
|
|
- /CMapType is always 2
|
|
- only bfchar and bfrange sections allowed
|
|
- no glyph names as target allowed, only hex strings
|
|
- target encoded in UTF16-BE
|
|
*/
|
|
|
|
pub(crate) type ArrayOfTargetStrings = Vec<Vec<u16>>;
|
|
|
|
// According to pdf documentation source codes can be of various byte length but they
|
|
// should be smaller than integer
|
|
pub(crate) type SourceCode = u32;
|
|
pub(crate) type CodeLen = u8;
|
|
pub(crate) type SourceRangeMapping = ((SourceCode, SourceCode, CodeLen), ArrayOfTargetStrings);
|
|
pub(crate) type SourceCharMapping = ((SourceCode, CodeLen), Vec<u16>);
|
|
#[derive(Debug, PartialEq)]
|
|
pub enum CMapSection {
|
|
CsRange(Vec<(SourceCode, SourceCode, CodeLen)>),
|
|
BfChar(Vec<SourceCharMapping>),
|
|
BfRange(Vec<SourceRangeMapping>),
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum CMapParseError {
|
|
Incomplete,
|
|
Error,
|
|
}
|