(fuzzer: &mut Fuzzer)
| 80 | } |
| 81 | |
| 82 | pub fn start(fuzzer: &mut Fuzzer) -> Result<Self, StageExit> |
| 83 | where |
| 84 | Self: Sized, |
| 85 | { |
| 86 | let input_id = fuzzer.input_id.ok_or(StageExit::Skip)?; |
| 87 | |
| 88 | fuzzer.copy_current_input(); |
| 89 | fuzzer.reset_input_cursor().unwrap(); |
| 90 | let mut mutated_input = fuzzer.state.input.clone(); |
| 91 | randomize_input(&mut fuzzer.rng, &mut mutated_input); |
| 92 | |
| 93 | Snapshot::restore_initial(fuzzer); |
| 94 | fuzzer.write_input_to_target().unwrap(); |
| 95 | fuzzer.execute().ok_or(StageExit::Interrupted)?; |
| 96 | let original_icount = fuzzer.vm.cpu.icount(); |
| 97 | |
| 98 | // If this input was generated via length extension, then we only try and colorize the newly |
| 99 | // extended bytes. |
| 100 | let prefix_bytes = match fuzzer.features.skip_prefix { |
| 101 | true => crate::utils::count_parent_prefix(fuzzer, input_id, true), |
| 102 | false => HashMap::new(), |
| 103 | }; |
| 104 | |
| 105 | let max_len = fuzzer.features.max_i2s_bytes; |
| 106 | |
| 107 | let mut remaining_streams = vec![]; |
| 108 | for (addr, stream) in &fuzzer.state.input.streams { |
| 109 | if !stream.bytes.is_empty() { |
| 110 | let max_len = prefix_bytes |
| 111 | .get(addr) |
| 112 | .map_or(max_len.min(stream.bytes.len()) as u32, |prefix| { |
| 113 | (stream.bytes.len() - *prefix) as u32 |
| 114 | }); |
| 115 | tracing::debug!( |
| 116 | "{addr:#x}: colorizing up to {max_len} of {} bytes", |
| 117 | stream.bytes.len() |
| 118 | ); |
| 119 | remaining_streams.push((*addr, max_len)); |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | Ok(Self { |
| 124 | input_id, |
| 125 | attempts: 0, |
| 126 | mutated_input, |
| 127 | remaining_streams, |
| 128 | ranges: std::collections::BinaryHeap::default(), |
| 129 | untainted_ranges: vec![], |
| 130 | colorized_bytes: HashMap::default(), |
| 131 | original_icount, |
| 132 | total_execs: 0, |
| 133 | }) |
| 134 | } |
| 135 | |
| 136 | fn fuzz_one(&mut self, fuzzer: &mut Fuzzer) -> Option<()> { |
| 137 | let range = self.next_range()?; |
nothing calls this directly
no test coverage detected