Coverage Report

Created: 2025-11-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ndpi/fuzz/fuzz_serialization.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
3.53k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
10
3.53k
  FuzzedDataProvider fuzzed_data(data, size);
11
3.53k
  u_int16_t i, num_iteration;
12
3.53k
  ndpi_serializer serializer, serializer_cloned, deserializer;
13
3.53k
  ndpi_serialization_format fmt;
14
3.53k
  int rc;
15
3.53k
  std::vector<char>d;
16
3.53k
  char kbuf[32];
17
3.53k
  u_int32_t buffer_len, kbuf_len;
18
19
  /* To allow memory allocation failures */
20
3.53k
  fuzz_set_alloc_callbacks_and_seed(size);
21
22
3.53k
  fmt = static_cast<ndpi_serialization_format>(fuzzed_data.ConsumeIntegralInRange(1, 5));
23
24
3.53k
  if (fuzzed_data.ConsumeBool())
25
2.69k
    rc = ndpi_init_serializer(&serializer, fmt);
26
846
  else
27
846
    rc = ndpi_init_serializer_ll(&serializer, fmt, fuzzed_data.ConsumeIntegralInRange(0, 64));
28
29
3.53k
  if (rc != 0)
30
34
    return 0;
31
    
32
3.50k
  if (fmt == ndpi_serialization_format_csv)
33
534
    ndpi_serializer_set_csv_separator(&serializer, ',');
34
35
3.50k
  num_iteration = fuzzed_data.ConsumeIntegralInRange(0, 8);
36
16.8k
  for (i = 0; i < num_iteration; i++) {
37
13.3k
    memset(kbuf, '\0', sizeof(kbuf)); /* It is also used as binary key */
38
13.3k
    snprintf(kbuf, sizeof(kbuf), "Key %d", i);
39
40
13.3k
    ndpi_serialize_uint32_uint32(&serializer, i, fuzzed_data.ConsumeIntegral<u_int32_t>());
41
13.3k
    ndpi_serialize_uint32_int32(&serializer, i, fuzzed_data.ConsumeIntegral<int32_t>());
42
13.3k
    ndpi_serialize_uint32_uint64(&serializer, i, fuzzed_data.ConsumeIntegral<u_int64_t>());
43
13.3k
    ndpi_serialize_uint32_int64(&serializer, i, fuzzed_data.ConsumeIntegral<int64_t>());
44
13.3k
    ndpi_serialize_uint32_float(&serializer, i, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
45
13.3k
    if (fmt != ndpi_serialization_format_tlv)
46
5.19k
      ndpi_serialize_uint32_double(&serializer, i, fuzzed_data.ConsumeFloatingPoint<double>(), "%lf");
47
13.3k
    d = fuzzed_data.ConsumeBytes<char>(16);
48
13.3k
    ndpi_serialize_uint32_binary(&serializer, i, d.data(), d.size());
49
13.3k
    ndpi_serialize_uint32_string(&serializer, i, fuzzed_data.ConsumeBytesAsString(8).c_str());
50
13.3k
    ndpi_serialize_uint32_boolean(&serializer, i, fuzzed_data.ConsumeIntegral<int8_t>());
51
52
13.3k
    ndpi_serialize_string_uint32(&serializer, kbuf, fuzzed_data.ConsumeIntegral<u_int32_t>());
53
13.3k
    ndpi_serialize_string_uint32_format(&serializer, kbuf, fuzzed_data.ConsumeIntegral<u_int32_t>(), "%d");
54
13.3k
    ndpi_serialize_string_int32(&serializer, kbuf, fuzzed_data.ConsumeIntegral<int32_t>());
55
13.3k
    ndpi_serialize_string_uint64(&serializer, kbuf, fuzzed_data.ConsumeIntegral<u_int64_t>());
56
13.3k
    ndpi_serialize_string_int64(&serializer, kbuf, fuzzed_data.ConsumeIntegral<int64_t>());
57
13.3k
    ndpi_serialize_string_float(&serializer, kbuf, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
58
13.3k
    if (fmt != ndpi_serialization_format_tlv)
59
5.19k
      ndpi_serialize_string_double(&serializer, kbuf, fuzzed_data.ConsumeFloatingPoint<double>(), "%lf");
60
13.3k
    d = fuzzed_data.ConsumeBytes<char>(16);
61
13.3k
    if (d.size())
62
5.79k
      ndpi_serialize_string_binary(&serializer, kbuf, d.data(), d.size());
63
13.3k
    ndpi_serialize_string_string(&serializer, kbuf, fuzzed_data.ConsumeBytesAsString(8).c_str());
64
13.3k
    d = fuzzed_data.ConsumeBytes<char>(16);
65
13.3k
    if (d.size())
66
5.71k
      ndpi_serialize_string_raw(&serializer, kbuf, d.data(), d.size());
67
13.3k
    ndpi_serialize_string_boolean(&serializer, kbuf, fuzzed_data.ConsumeIntegral<int8_t>());
68
69
13.3k
    if (fuzzed_data.ConsumeBool()) {
70
2.41k
      snprintf(kbuf, sizeof(kbuf), "%d", i); /* To trigger OPTIMIZE_NUMERIC_KEYS */
71
2.41k
      kbuf_len = strlen(kbuf);
72
10.9k
    } else {
73
10.9k
      kbuf_len = sizeof(kbuf);
74
10.9k
    }
75
13.3k
    ndpi_serialize_binary_uint32(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeIntegral<u_int32_t>());
76
13.3k
    ndpi_serialize_binary_int32(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeIntegral<int32_t>());
77
13.3k
    ndpi_serialize_binary_uint64(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeIntegral<u_int64_t>());
78
13.3k
    ndpi_serialize_binary_int64(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeIntegral<int64_t>());
79
13.3k
    ndpi_serialize_binary_float(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
80
13.3k
    if (fmt != ndpi_serialization_format_tlv)
81
5.19k
      ndpi_serialize_binary_double(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeFloatingPoint<double>(), "%lf");
82
13.3k
    ndpi_serialize_binary_boolean(&serializer, kbuf, kbuf_len, fuzzed_data.ConsumeIntegral<int8_t>());
83
13.3k
    d = fuzzed_data.ConsumeBytes<char>(16);
84
13.3k
    if (d.size())
85
5.48k
      ndpi_serialize_binary_binary(&serializer, kbuf, kbuf_len, d.data(), d.size());
86
87
13.3k
    if ((i & 0x3) == 0x3)
88
2.56k
      ndpi_serialize_end_of_record(&serializer);
89
13.3k
  }
90
91
3.50k
  ndpi_serializer_create_snapshot(&serializer);
92
93
3.50k
  if (fuzzed_data.ConsumeBool())
94
716
    ndpi_serializer_skip_header(&serializer);
95
96
3.50k
  if (fuzzed_data.ConsumeBool()) {
97
530
    ndpi_serialize_start_of_block(&serializer, "Block");
98
530
    memset(kbuf, '\0', sizeof(kbuf)); /* It is also used as binary key */
99
530
    snprintf(kbuf, sizeof(kbuf), "K-Ignored");
100
530
    ndpi_serialize_uint32_uint32(&serializer, fuzzed_data.ConsumeIntegral<u_int32_t>(), fuzzed_data.ConsumeIntegral<u_int32_t>());
101
530
    ndpi_serialize_string_string(&serializer, kbuf, fuzzed_data.ConsumeBytesAsString(8).c_str());
102
530
    ndpi_serialize_string_float(&serializer, kbuf, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
103
530
    ndpi_serialize_binary_boolean(&serializer, kbuf, sizeof(kbuf), fuzzed_data.ConsumeIntegral<int8_t>());
104
530
    ndpi_serialize_end_of_block(&serializer);
105
530
  }
106
107
3.50k
  if (fuzzed_data.ConsumeBool()) {
108
719
    ndpi_serialize_start_of_block_uint32(&serializer, 0);
109
719
    memset(kbuf, '\0', sizeof(kbuf)); /* It is also used as binary key */
110
719
    snprintf(kbuf, sizeof(kbuf), "K32-Ignored");
111
719
    ndpi_serialize_uint32_uint32(&serializer, i, fuzzed_data.ConsumeIntegral<u_int32_t>());
112
719
    ndpi_serialize_string_string(&serializer, kbuf, fuzzed_data.ConsumeBytesAsString(8).c_str());
113
719
    ndpi_serialize_string_float(&serializer, kbuf, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
114
719
    ndpi_serialize_binary_boolean(&serializer, kbuf, sizeof(kbuf), fuzzed_data.ConsumeIntegral<int8_t>());
115
719
    ndpi_serialize_end_of_block(&serializer);
116
719
  }
117
118
3.50k
  if (fmt == ndpi_serialization_format_json) {
119
288
    if (fuzzed_data.ConsumeBool()) {
120
74
      d = fuzzed_data.ConsumeBytes<char>(8);
121
74
      if (d.size())
122
72
        ndpi_serialize_raw_record(&serializer, (u_char *)d.data(), d.size());
123
74
    }
124
288
  }
125
126
3.50k
  if (fuzzed_data.ConsumeBool())
127
443
    ndpi_serializer_rollback_snapshot(&serializer);
128
129
3.50k
  rc = ndpi_serialize_start_of_list(&serializer, "List");
130
3.50k
  if (rc == 0) {
131
132
2.93k
    num_iteration = fuzzed_data.ConsumeIntegralInRange(0, 8);
133
6.11k
    for (i = 0; i < num_iteration; i++) {
134
3.18k
      memset(kbuf, '\0', sizeof(kbuf)); /* It is also used as binary key */
135
3.18k
      snprintf(kbuf, sizeof(kbuf), "Ignored");
136
3.18k
      ndpi_serialize_uint32_uint32(&serializer, i, fuzzed_data.ConsumeIntegral<u_int32_t>());
137
3.18k
      ndpi_serialize_string_string(&serializer, kbuf, fuzzed_data.ConsumeBytesAsString(8).c_str());
138
3.18k
      ndpi_serialize_string_float(&serializer, kbuf, fuzzed_data.ConsumeFloatingPoint<float>(), "%f");
139
3.18k
      ndpi_serialize_binary_boolean(&serializer, kbuf, sizeof(kbuf), fuzzed_data.ConsumeIntegral<int8_t>());
140
3.18k
    }
141
142
2.93k
    ndpi_serialize_end_of_list(&serializer);
143
2.93k
    ndpi_serialize_string_string(&serializer, "Last", "Ok");
144
2.93k
  }
145
146
3.50k
  if (fmt == ndpi_serialization_format_csv) {
147
534
    ndpi_serializer_get_header(&serializer, &buffer_len);
148
534
    ndpi_serializer_get_buffer(&serializer, &buffer_len);
149
534
    ndpi_serializer_set_buffer_len(&serializer, fuzzed_data.ConsumeIntegral<u_int32_t>());
150
2.97k
  } else if (fmt == ndpi_serialization_format_tlv) {
151
    /* Conversion from tlv to json */
152
2.16k
    rc = ndpi_init_deserializer(&deserializer, &serializer);
153
2.16k
    if (rc == 0) {
154
2.16k
      rc = ndpi_init_serializer_ll(&serializer_cloned, ndpi_serialization_format_json, fuzzed_data.ConsumeIntegralInRange(0, 2048));
155
2.16k
      if (rc == 0) {
156
904
        ndpi_deserialize_clone_all(&deserializer, &serializer_cloned);
157
904
  ndpi_serializer_get_format(&serializer_cloned);
158
904
        ndpi_serializer_get_buffer(&serializer_cloned, &buffer_len);
159
904
  ndpi_serializer_get_buffer_len(&serializer_cloned);
160
904
  ndpi_serializer_get_internal_buffer_size(&serializer_cloned);
161
904
  ndpi_term_serializer(&serializer_cloned);
162
904
  assert(ndpi_deserialize_get_format(&deserializer) == ndpi_serialization_format_tlv);
163
904
      }
164
2.16k
    }
165
166
2.16k
    rc = ndpi_init_deserializer(&deserializer, &serializer);
167
2.16k
    if (rc == 0) {
168
2.16k
      rc = ndpi_init_serializer_ll(&serializer_cloned, ndpi_serialization_format_tlv, fuzzed_data.ConsumeIntegralInRange(0, 2048));
169
2.16k
      if (rc == 0) {
170
464
        ndpi_deserialize_clone_item(&deserializer, &serializer_cloned);
171
464
  ndpi_term_serializer(&serializer_cloned);
172
464
      }
173
2.16k
    }
174
2.16k
  }
175
176
3.50k
  ndpi_term_serializer(&serializer);
177
178
3.50k
  return 0;
179
3.50k
}