Skip to content

Commit 0f4853d

Browse files
committed
vary alignment in checksum fuzzer
some checksum implementations are sensitive to alignment
1 parent e51e62b commit 0f4853d

1 file changed

Lines changed: 29 additions & 4 deletions

File tree

fuzz/fuzz_targets/checksum.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,35 @@
55
66
use libfuzzer_sys::fuzz_target;
77

8-
fuzz_target!(|input: (Vec<u8>, u32)| {
9-
let (input, start) = input;
8+
const BASE: u32 = 65521;
9+
10+
fn adler32_scalar(start: u32, data: &[u8]) -> u32 {
11+
let mut s1 = start & 0xffff;
12+
let mut s2 = (start >> 16) & 0xffff;
13+
for &b in data {
14+
s1 = (s1 + b as u32) % BASE;
15+
s2 = (s2 + s1) % BASE;
16+
}
17+
(s2 << 16) | s1
18+
}
19+
20+
fuzz_target!(|input: (Vec<u8>, u8, u32)| {
21+
let (input, offset, start) = input;
22+
23+
// Add an offset to the input because some of the checksum algorithms are sensitive to
24+
// alignment.
25+
let Some(input) = input.get(usize::from(offset)..) else {
26+
return;
27+
};
1028

1129
{
1230
let expected = {
1331
let mut h = crc32fast::Hasher::new_with_initial(start);
14-
h.update(&input[..]);
32+
h.update(input);
1533
h.finalize()
1634
};
1735

18-
let actual = zlib_rs::crc32::crc32(start, input.as_slice());
36+
let actual = zlib_rs::crc32::crc32(start, input);
1937

2038
assert_eq!(expected, actual);
2139
}
@@ -53,11 +71,18 @@ fuzz_target!(|input: (Vec<u8>, u32)| {
5371
assert_eq!(combine1, combine2);
5472
}
5573

74+
{
75+
use zlib_rs::adler32::adler32;
76+
assert_eq!(adler32(start, &input), adler32_scalar(start, &input));
77+
}
78+
5679
{
5780
use zlib_rs::adler32::{adler32, adler32_combine};
5881

5982
let data = &input;
6083

84+
assert_eq!(adler32(start, data), adler32_scalar(start, data));
85+
6186
let Some(buf_len) = data.first().copied() else {
6287
return;
6388
};

0 commit comments

Comments
 (0)