Coverage Report

Created: 2026-02-21 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}