Coverage Report

Created: 2025-08-26 06:57

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