/src/ndpi/fuzz/fuzz_alg_bins.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 "fuzzer/FuzzedDataProvider.h" |
7 | | |
8 | 569 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
9 | 569 | FuzzedDataProvider fuzzed_data(data, size); |
10 | 569 | u_int16_t j, i, num_iteration; |
11 | 569 | struct ndpi_bin *b, *b_cloned, *bins, b2; |
12 | 569 | u_int16_t num_bins, num_cluster_ids, num_element, num_allocated_bins, rc; |
13 | 569 | enum ndpi_bin_family family; |
14 | 569 | u_int16_t *cluster_ids; |
15 | 569 | char buf[128]; |
16 | | |
17 | | /* Just to have some data */ |
18 | 569 | if(fuzzed_data.remaining_bytes() < 2048) |
19 | 20 | return -1; |
20 | | |
21 | | /* To allow memory allocation failures */ |
22 | 549 | fuzz_set_alloc_callbacks_and_seed(size); |
23 | | |
24 | 549 | b = (struct ndpi_bin *)ndpi_malloc(sizeof(struct ndpi_bin)); |
25 | | |
26 | 549 | num_bins = fuzzed_data.ConsumeIntegral<u_int16_t>(); |
27 | 549 | family = fuzzed_data.ConsumeEnum<enum ndpi_bin_family>(); |
28 | | |
29 | 549 | ndpi_init_bin(b, family, num_bins); |
30 | 549 | ndpi_init_bin(&b2, family, num_bins * 2); |
31 | | |
32 | 549 | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
33 | 27.8k | for (i = 0; i < num_iteration; i++) { |
34 | 27.3k | ndpi_inc_bin(b, fuzzed_data.ConsumeIntegral<u_int16_t>(), |
35 | 27.3k | fuzzed_data.ConsumeIntegral<u_int64_t>()); |
36 | 27.3k | ndpi_inc_bin(&b2, fuzzed_data.ConsumeIntegral<u_int16_t>(), |
37 | 27.3k | fuzzed_data.ConsumeIntegral<u_int64_t>()); |
38 | 27.3k | } |
39 | | |
40 | 549 | ndpi_bin_similarity(b, &b2, fuzzed_data.ConsumeBool(), |
41 | 549 | fuzzed_data.ConsumeFloatingPointInRange<float>(0, 1)); |
42 | | |
43 | 549 | b_cloned = ndpi_clone_bin(b); |
44 | | |
45 | 549 | ndpi_bin_similarity(b, b_cloned, fuzzed_data.ConsumeBool(), |
46 | 549 | fuzzed_data.ConsumeFloatingPointInRange<float>(0, 1)); |
47 | | |
48 | 27.8k | for (i = 0; i < num_iteration; i++) |
49 | 27.3k | ndpi_get_bin_value(b, fuzzed_data.ConsumeIntegral<u_int16_t>()); |
50 | | |
51 | 549 | ndpi_reset_bin(b); |
52 | | |
53 | 27.8k | for (i = 0; i < num_iteration; i++) |
54 | 27.3k | ndpi_get_bin_value(b, fuzzed_data.ConsumeIntegral<u_int16_t>()); |
55 | | |
56 | 27.8k | for (i = 0; i < num_iteration; i++) |
57 | 27.3k | ndpi_set_bin(b_cloned, fuzzed_data.ConsumeIntegral<u_int16_t>(), |
58 | 27.3k | fuzzed_data.ConsumeIntegral<u_int64_t>()); |
59 | | |
60 | 549 | ndpi_bin_similarity(b, b_cloned, fuzzed_data.ConsumeBool(), |
61 | 549 | fuzzed_data.ConsumeFloatingPointInRange<float>(0, 1)); |
62 | | |
63 | 549 | ndpi_normalize_bin(b); |
64 | 549 | ndpi_normalize_bin(b_cloned); |
65 | | |
66 | 549 | ndpi_print_bin(b, fuzzed_data.ConsumeBool(), buf, sizeof(buf)); |
67 | | |
68 | 549 | ndpi_free_bin(b); |
69 | 549 | ndpi_free(b); |
70 | 549 | ndpi_free_bin(&b2); |
71 | 549 | ndpi_free_bin(b_cloned); |
72 | 549 | ndpi_free(b_cloned); |
73 | | |
74 | | /* Cluster */ |
75 | | |
76 | 549 | num_bins = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
77 | 549 | num_element = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
78 | 549 | num_cluster_ids = fuzzed_data.ConsumeIntegral<u_int16_t>(); |
79 | 549 | bins = (struct ndpi_bin *)ndpi_malloc(sizeof(struct ndpi_bin) * num_bins); |
80 | 549 | cluster_ids = (u_int16_t *)ndpi_malloc(sizeof(u_int16_t) * num_bins); |
81 | | |
82 | 549 | num_allocated_bins = 0; |
83 | 549 | if (bins && cluster_ids) { |
84 | 36.9k | for (i = 0; i < num_bins; i++) { |
85 | 36.4k | rc = ndpi_init_bin(&bins[num_allocated_bins], ndpi_bin_family64 /* Use 64 bit to avoid overlaps */, |
86 | 36.4k | num_element); |
87 | 36.4k | if (rc != 0) { |
88 | 1.92k | continue; |
89 | 1.92k | } |
90 | 34.4k | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
91 | 700k | for (j = 0; j < num_iteration; j++) { |
92 | 666k | ndpi_set_bin(&bins[num_allocated_bins], |
93 | 666k | fuzzed_data.ConsumeIntegralInRange(0, num_element + 1), |
94 | 666k | fuzzed_data.ConsumeIntegral<u_int64_t>()); |
95 | 666k | } |
96 | 34.4k | num_allocated_bins++; |
97 | 34.4k | } |
98 | 508 | ndpi_cluster_bins(bins, num_allocated_bins, num_cluster_ids, cluster_ids, NULL); |
99 | 508 | } |
100 | | |
101 | 549 | ndpi_free(cluster_ids); |
102 | 549 | if (bins) |
103 | 35.0k | for (i = 0; i < num_allocated_bins; i++) |
104 | 34.4k | ndpi_free_bin(&bins[i]); |
105 | 549 | ndpi_free(bins); |
106 | | |
107 | 549 | return 0; |
108 | 569 | } |