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