@@ -285,7 +285,7 @@ macro_rules! fuzz_target {
285
285
/// let len = decompressed.len();
286
286
/// let cap = decompressed.capacity();
287
287
/// decompressed.resize(cap, 0);
288
- /// let new_decompressed_size = libfuzzer_sys::fuzzer_mutate(&mut decompressed, len);
288
+ /// let new_decompressed_size = libfuzzer_sys::fuzzer_mutate(&mut decompressed, len, cap );
289
289
///
290
290
/// // Recompress the mutated data.
291
291
/// let compressed = compress(&decompressed[..new_decompressed_size]);
@@ -374,25 +374,37 @@ macro_rules! fuzz_mutator {
374
374
/// You generally don't have to use this at all unless you're defining a
375
375
/// custom mutator with [the `fuzz_mutator!` macro][crate::fuzz_mutator].
376
376
///
377
- /// Mutates `data[..size]` in place and returns the new size of the mutated
378
- /// data.
377
+ /// Mutates `data[..size]` in place such that the mutated data is no larger than
378
+ /// `max_size` and returns the new size of the mutated data.
379
+ ///
380
+ /// To only allow shrinking mutations, make `max_size < size`.
381
+ ///
382
+ /// To additionally allow mutations that grow the size of the data, make
383
+ /// `max_size > size`.
384
+ ///
385
+ /// Both `size` and `max_size` must be less than or equal to `data.len()`.
379
386
///
380
387
/// # Example
381
388
///
382
389
/// ```no_run
383
390
/// // Create some data in a buffer.
384
391
/// let mut data = vec![0; 128];
385
- /// data[..5 ].copy_from_slice(b"hello");
392
+ /// data[..b"hello".len() ].copy_from_slice(b"hello");
386
393
///
387
- /// // Ask `libFuzzer` to mutate the data.
388
- /// let new_size = libfuzzer_sys::fuzzer_mutate(&mut data, 5);
394
+ /// // Ask `libFuzzer` to mutate the data. By setting `max_size` to our buffer's
395
+ /// // full length, we are allowing `libFuzzer` to perform mutations that grow
396
+ /// // the size of the data, such as insertions.
397
+ /// let size = b"hello".len();
398
+ /// let max_size = data.len();
399
+ /// let new_size = libfuzzer_sys::fuzzer_mutate(&mut data, size, max_size);
389
400
///
390
401
/// // Get the mutated data out of the buffer.
391
402
/// let mutated_data = &data[..new_size];
392
403
/// ```
393
- pub fn fuzzer_mutate ( data : & mut [ u8 ] , size : usize ) -> usize {
404
+ pub fn fuzzer_mutate ( data : & mut [ u8 ] , size : usize , max_size : usize ) -> usize {
394
405
assert ! ( size <= data. len( ) ) ;
395
- let new_size = unsafe { LLVMFuzzerMutate ( data. as_mut_ptr ( ) , size, data. len ( ) ) } ;
406
+ assert ! ( max_size <= data. len( ) ) ;
407
+ let new_size = unsafe { LLVMFuzzerMutate ( data. as_mut_ptr ( ) , size, max_size) } ;
396
408
assert ! ( new_size <= data. len( ) ) ;
397
409
new_size
398
410
}
0 commit comments