Coverage Report

Created: 2025-08-26 07:06

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