(&mut self, fuzzer: &Fuzzer)
| 232 | } |
| 233 | |
| 234 | fn next_replacement(&mut self, fuzzer: &Fuzzer) -> Option<()> { |
| 235 | loop { |
| 236 | if self.cursor.stream >= self.base_input.streams.len() { |
| 237 | return None; |
| 238 | } |
| 239 | |
| 240 | let (stream_key, dst) = |
| 241 | fuzzer.state.input.streams.iter().nth(self.cursor.stream).unwrap(); |
| 242 | |
| 243 | if crate::utils::is_interrupt_stream(*stream_key) { |
| 244 | self.cursor.stream += 1; |
| 245 | } |
| 246 | |
| 247 | let max_len = self |
| 248 | .parent_prefix |
| 249 | .get(stream_key) |
| 250 | .map_or(fuzzer.features.max_i2s_bytes, |prefix| dst.bytes.len() - *prefix); |
| 251 | self.cursor.finder.offset = |
| 252 | self.cursor.finder.offset.max(dst.bytes.len().saturating_sub(max_len)); |
| 253 | |
| 254 | loop { |
| 255 | let found = match self.comparisons.get(self.cursor.cmp) { |
| 256 | Some((addr, operands)) => match self.cursor.finder.find_match(dst, operands) { |
| 257 | true => Some(addr), |
| 258 | false => None, |
| 259 | }, |
| 260 | None => { |
| 261 | self.cursor.cmp.array += 1; |
| 262 | if self.cursor.cmp.array > 4 { |
| 263 | break; |
| 264 | } |
| 265 | self.cursor.cmp.offset = 0; |
| 266 | continue; |
| 267 | } |
| 268 | }; |
| 269 | |
| 270 | if let Some(addr) = found { |
| 271 | if self.hit_replacement_limit(&dst.bytes) { |
| 272 | self.cursor.finder.offset += 1; |
| 273 | continue; |
| 274 | } |
| 275 | |
| 276 | let offset = self.cursor.finder.offset; |
| 277 | self.cursor.finder.offset += 1; |
| 278 | |
| 279 | self.replacement.cmp_addr = addr; |
| 280 | self.replacement.cmp_array = self.cursor.cmp.array; |
| 281 | self.replacement.cmp_offset = self.cursor.cmp.offset; |
| 282 | self.replacement.stream_key = *stream_key; |
| 283 | self.replacement.stream_offset = offset; |
| 284 | self.replacement.bytes.clone_from(&self.cursor.finder.replacement); |
| 285 | self.replacement.extended.clone_from(&self.cursor.finder.extended_replacement); |
| 286 | self.replacement.stride = self.cursor.finder.stride as usize; |
| 287 | |
| 288 | if fuzzer.debug.cmplog { |
| 289 | self.attempted.push(self.replacement.clone()); |
| 290 | } |
| 291 |
no test coverage detected