/src/ndpi/fuzz/fuzz_ds_kdtree.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 | 306 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
10 | 306 | FuzzedDataProvider fuzzed_data(data, size); |
11 | 306 | u_int16_t i, j, rc, num_iteration, is_added = 0, num_dimensions; |
12 | 306 | ndpi_kd_tree *k = NULL; |
13 | 306 | double *values, *values_added; |
14 | | |
15 | | /* Just to have some data */ |
16 | 306 | if (fuzzed_data.remaining_bytes() < 1024) |
17 | 18 | return -1; |
18 | | |
19 | | /* To allow memory allocation failures */ |
20 | 288 | fuzz_set_alloc_callbacks_and_seed(size); |
21 | | |
22 | 288 | num_dimensions = fuzzed_data.ConsumeIntegralInRange(1, 8); |
23 | | |
24 | 288 | values = (double *)ndpi_malloc(sizeof(double) * num_dimensions); |
25 | 288 | values_added = (double *)ndpi_malloc(sizeof(double) * num_dimensions); |
26 | 288 | if (!values || !values_added) { |
27 | 4 | ndpi_free(values); |
28 | 4 | ndpi_free(values_added); |
29 | 4 | return 0; |
30 | 4 | } |
31 | | |
32 | 284 | k = ndpi_kd_create(num_dimensions); |
33 | | |
34 | 284 | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
35 | 22.8k | for (i = 0; i < num_iteration; i++) { |
36 | | |
37 | 112k | for (j = 0; j < num_dimensions; j++) |
38 | 90.4k | values[j] = fuzzed_data.ConsumeFloatingPoint<double>(); |
39 | | |
40 | 22.5k | rc = ndpi_kd_insert(k, values, NULL); |
41 | | |
42 | | /* Keep one random entry really added */ |
43 | 22.5k | if (rc == 0 && fuzzed_data.ConsumeBool()) { |
44 | 5.96k | for (j = 0; j < num_dimensions; j++) |
45 | 4.47k | values_added[j] = values[j]; |
46 | 1.49k | is_added = 1; |
47 | 1.49k | } |
48 | 22.5k | } |
49 | | |
50 | | /* "Random" search */ |
51 | 284 | num_iteration = fuzzed_data.ConsumeIntegral<u_int8_t>(); |
52 | 22.3k | for (i = 0; i < num_iteration; i++) { |
53 | 22.1k | ndpi_kd_tree_result *res = NULL; |
54 | 22.1k | double *user_data; |
55 | | |
56 | 100k | for (j = 0; j < num_dimensions; j++) |
57 | 78.5k | values[j] = fuzzed_data.ConsumeFloatingPoint<double>(); |
58 | | |
59 | 22.1k | res = ndpi_kd_nearest(k, values); |
60 | 22.1k | if (res) { |
61 | 12.2k | ndpi_kd_num_results(res); |
62 | 12.2k | ndpi_kd_result_get_item(res, &user_data); |
63 | 12.2k | if(is_added) { |
64 | 9.08k | ndpi_kd_distance(values, values_added, num_dimensions); |
65 | 9.08k | } |
66 | 12.2k | ndpi_kd_result_free(res); |
67 | 12.2k | } |
68 | | |
69 | 22.1k | } |
70 | | /* Search of an added entry */ |
71 | 284 | if (is_added) { |
72 | 164 | ndpi_kd_tree_result *res = NULL; |
73 | 164 | double *user_data; |
74 | | |
75 | 164 | res = ndpi_kd_nearest(k, values_added); |
76 | 164 | if (res) { |
77 | 102 | ndpi_kd_num_results(res); |
78 | 102 | ndpi_kd_result_get_item(res, &user_data); |
79 | 102 | ndpi_kd_result_free(res); |
80 | 102 | } |
81 | 164 | } |
82 | | |
83 | 284 | ndpi_free(values); |
84 | 284 | ndpi_free(values_added); |
85 | 284 | ndpi_kd_clear(k); |
86 | 284 | ndpi_kd_free(k); |
87 | | |
88 | 284 | return 0; |
89 | 288 | } |