/src/ndpi/fuzz/fuzz_ds_hash.cpp
Line | Count | Source |
1 | | #include "ndpi_api.h" |
2 | | #include "fuzz_common_code.h" |
3 | | |
4 | | #include <stdint.h> |
5 | | #include <stdio.h> |
6 | | #include <assert.h> |
7 | | #include "fuzzer/FuzzedDataProvider.h" |
8 | | |
9 | 34.3k | extern "C" void cleanup_func(ndpi_str_hash *h) { |
10 | | /* Nothing to do */ |
11 | 34.3k | return; |
12 | 34.3k | } |
13 | | |
14 | 366 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
15 | 366 | FuzzedDataProvider fuzzed_data(data, size); |
16 | 366 | u_int16_t i, rc, num_iteration, data_len, is_added = 0; |
17 | 366 | std::vector<char>value_added; |
18 | 366 | void *value; |
19 | 366 | ndpi_str_hash *h = NULL; |
20 | | |
21 | | /* Just to have some data */ |
22 | 366 | if (fuzzed_data.remaining_bytes() < 1024) |
23 | 18 | return -1; |
24 | | |
25 | | /* To allow memory allocation failures */ |
26 | 348 | fuzz_set_alloc_callbacks_and_seed(size); |
27 | | |
28 | 348 | if (fuzzed_data.ConsumeBool()) |
29 | 166 | ndpi_hash_init(&h); |
30 | 182 | else |
31 | 182 | ndpi_hash_init(NULL); |
32 | | |
33 | 348 | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
34 | 37.4k | for (i = 0; i < num_iteration; i++) { |
35 | | |
36 | 37.0k | data_len = fuzzed_data.ConsumeIntegralInRange(0, 127); |
37 | 37.0k | std::vector<char>data = fuzzed_data.ConsumeBytes<char>(data_len); |
38 | | |
39 | 37.0k | rc = ndpi_hash_add_entry(&h, data.data(), data.size(), &i); |
40 | | /* Keep one random entry really added */ |
41 | 37.0k | if (rc == 0 && fuzzed_data.ConsumeBool()) { |
42 | 13.8k | value_added = data; |
43 | 13.8k | is_added = 1; |
44 | 13.8k | } |
45 | 37.0k | } |
46 | | |
47 | | /* "Random" search */ |
48 | 348 | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
49 | 27.6k | for (i = 0; i < num_iteration; i++) { |
50 | 27.3k | data_len = fuzzed_data.ConsumeIntegralInRange(0, 127); |
51 | 27.3k | std::vector<char>data = fuzzed_data.ConsumeBytes<char>(data_len); |
52 | | |
53 | 27.3k | ndpi_hash_find_entry(h, data.data(), data.size(), &value); |
54 | 27.3k | } |
55 | | /* Search of an added entry */ |
56 | 348 | if (is_added) { |
57 | 247 | ndpi_hash_find_entry(h, value_added.data(), value_added.size(), &value); |
58 | 247 | } |
59 | | |
60 | 348 | if (fuzzed_data.ConsumeBool()) |
61 | 54 | ndpi_hash_free(NULL, cleanup_func); |
62 | 348 | ndpi_hash_free(&h, cleanup_func); |
63 | | |
64 | 348 | return 0; |
65 | 366 | } |