Coverage Report

Created: 2025-07-18 07:07

/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
}