Coverage Report

Created: 2025-10-10 06:36

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