Coverage Report

Created: 2025-07-02 06:28

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