MCPcopy Create free account
hub / github.com/MultiFuzz/MultiFuzz / next_replacement

Method next_replacement

hail-fuzz/src/i2s/replacement.rs:234–306  ·  view source on GitHub ↗
(&mut self, fuzzer: &Fuzzer)

Source from the content-addressed store, hash-verified

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

Callers 1

runMethod · 0.80

Calls 9

is_interrupt_streamFunction · 0.85
find_matchMethod · 0.80
hit_replacement_limitMethod · 0.80
clone_fromMethod · 0.80
cloneMethod · 0.80
lenMethod · 0.45
getMethod · 0.45
resetMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected