/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 | } |