Coverage Report

Created: 2025-08-03 06:32

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