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