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