pdftract/fuzz/fuzz_targets/stream_decoder.rs
jedarden 9aa26a449e docs(pdftract-49f8): establish Cargo.lock policy and documentation
This commit implements the Cargo.lock policy for reproducible builds
across all workspace members (pdftract-core, pdftract-cli, pdftract-py).

Changes:
- Add CONTRIBUTING.md with lockfile-update workflow documentation
- Add .renovaterc.json for weekly lockfile-only PRs (human-gated)
- Add crates/pdftract-core/README.md with rationale for checked-in lockfiles
- Add notes/pdftract-49f8.md with verification note

The Argo workflow updates (pdftract-ci.yaml) are committed separately
in the declarative-config repo.

Acceptance criteria:
- PASS: Cargo.lock tracked by git, not in .gitignore
- PASS: Argo workflow templates document --locked/--frozen requirements
- WARN: Enforcement to be completed when placeholder templates are implemented
- WARN: Binary reproducibility verification deferred to pdftract-build-binaries implementation

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 18:13:14 -04:00

39 lines
1.3 KiB
Rust

//! Fuzz target for the PDF stream decoder.
//!
//! This target tests INV-8 (no panic at public boundary) for the stream decoder.
//! Any panic indicates a stream decoder bug that must be fixed.
//!
//! This also tests EC-10 (decompression bomb) - the 2 GB limit must hold
//! under random predictor inputs.
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
use pdftract_core::parser::stream::{
FlateDecoder, ASCII85Decoder, ASCIIHexDecoder, LZWDecoder,
DEFAULT_MAX_DECOMPRESS_BYTES,
};
let mut counter = 0;
// Test FlateDecoder - must never panic
let _ = FlateDecoder.decode(data, None, &mut counter, DEFAULT_MAX_DECOMPRESS_BYTES);
// Test ASCII85Decoder - must never panic
let mut counter = 0;
let _ = ASCII85Decoder.decode(data, None, &mut counter, DEFAULT_MAX_DECOMPRESS_BYTES);
// Test ASCIIHexDecoder - must never panic
let mut counter = 0;
let _ = ASCIIHexDecoder.decode(data, None, &mut counter, DEFAULT_MAX_DECOMPRESS_BYTES);
// Test LZWDecoder - must never panic
let mut counter = 0;
let _ = LZWDecoder.decode(data, None, &mut counter, DEFAULT_MAX_DECOMPRESS_BYTES);
// Test with very low bomb limit (EC-10 decompression bomb)
let mut counter = 0;
let low_limit: u64 = 100;
let _ = FlateDecoder.decode(data, None, &mut counter, low_limit);
});