diff options
| author | Valentin Popov <valentin@popov.link> | 2026-06-30 01:45:09 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-06-30 01:45:09 +0300 |
| commit | c0116d32bea18859f1310ed01d8ac074ac676dda (patch) | |
| tree | c6c9845d5e560845d70d2f984053b15a557ff991 | |
| parent | 0a7ba55b441f3b36a294b18e96b2887d6fd47b45 (diff) | |
| download | fparkan-c0116d32bea18859f1310ed01d8ac074ac676dda.tar.xz fparkan-c0116d32bea18859f1310ed01d8ac074ac676dda.zip | |
test(nres): cover input byte limit enforcement
| -rw-r--r-- | crates/fparkan-nres/src/lib.rs | 28 | ||||
| -rw-r--r-- | fixtures/acceptance/coverage.tsv | 2 |
2 files changed, 29 insertions, 1 deletions
diff --git a/crates/fparkan-nres/src/lib.rs b/crates/fparkan-nres/src/lib.rs index 3a8e264..2511d8c 100644 --- a/crates/fparkan-nres/src/lib.rs +++ b/crates/fparkan-nres/src/lib.rs @@ -1634,6 +1634,34 @@ mod tests { } #[test] + fn decode_rejects_input_bytes_above_limit() { + let bytes = build_archive(&[SyntheticEntry { + type_id: 1, + attr1: 0, + attr2: 0, + attr3: 0, + name: "payload", + payload: b"data", + }]); + let exact_size = u64::try_from(bytes.len()).expect("archive size"); + + assert!(matches!( + decode_with_limits( + arc(bytes), + ReadProfile::Strict, + DecodeLimits { + max_input_bytes: exact_size - 1, + ..DecodeLimits::default() + } + ), + Err(NresError::Binary(DecodeError::LimitExceeded { + count, + limit + })) if count == exact_size && limit == exact_size - 1 + )); + } + + #[test] fn decode_rejects_preserved_bytes_above_limit() { let bytes = build_archive_with_nonzero_prefix_gap(&[SyntheticEntry { type_id: 1, diff --git a/fixtures/acceptance/coverage.tsv b/fixtures/acceptance/coverage.tsv index 2917c62..3ec44f4 100644 --- a/fixtures/acceptance/coverage.tsv +++ b/fixtures/acceptance/coverage.tsv @@ -103,7 +103,7 @@ S1-NRES-023 covered cargo test -p fparkan-nres --offline editor_payload_update_r S1-NRES-024 covered cargo test -p fparkan-nres --offline editor_rename_rebuilds_search_mapping S1-NRES-025 covered cargo test -p fparkan-nres --offline editor_rejects_invalid_authoring_names S1-NRES-026 covered cargo test -p fparkan-nres --offline strict_rejects_unsorted_lookup_table -S1-LIMIT-001 partial cargo test -p fparkan-nres --offline rejects_directory_size_before_allocation decode_rejects_entry_count_above_limit decode_rejects_preserved_bytes_above_limit; explicit max_input_bytes boundary test is still missing +S1-LIMIT-001 covered cargo test -p fparkan-nres --offline rejects_directory_size_before_allocation decode_rejects_entry_count_above_limit decode_rejects_input_bytes_above_limit decode_rejects_preserved_bytes_above_limit S1-NRES-PROP-001 covered cargo test -p fparkan-nres --offline generated_archives_preserve_lossless_and_canonical_semantics S1-NRES-PROP-002 covered cargo test -p fparkan-nres --offline generated_editor_updates_roundtrip S1-NRES-FUZZ-001 covered cargo test -p fparkan-nres --offline arbitrary_small_inputs_do_not_panic_or_overallocate |
