| 371 | } |
| 372 | |
| 373 | fn save_metadata(fuzzer: &mut Fuzzer, state: &MultiStreamExtendStage) { |
| 374 | if !fuzzer.debug.save_length_extension_metadata { |
| 375 | return; |
| 376 | } |
| 377 | |
| 378 | for (addr, _) in &state.streams_to_mutate { |
| 379 | let prev_size = state.current_input.streams.get(addr).map_or(0, |x| x.bytes.len()); |
| 380 | let size = fuzzer.state.input.streams.get(addr).map_or(0, |x| x.bytes.len()); |
| 381 | |
| 382 | let diff = size.saturating_sub(prev_size); |
| 383 | |
| 384 | let metadata = fuzzer.corpus.metadata.streams.entry(*addr).or_default(); |
| 385 | if fuzzer.state.new_coverage { |
| 386 | *metadata.successful_extensions.entry(diff).or_default() += 1; |
| 387 | } |
| 388 | else { |
| 389 | *metadata.failed_extensions.entry(diff).or_default() += 1; |
| 390 | } |
| 391 | } |
| 392 | } |
| 393 | |
| 394 | /// Determine the maximum number of length extensions to apply to try. |
| 395 | fn log2_max_extensions(fuzzer: &Fuzzer) -> u32 { |