Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright 2021 Google LLC |
2 | | Licensed under the Apache License, Version 2.0 (the "License"); |
3 | | you may not use this file except in compliance with the License. |
4 | | You may obtain a copy of the License at |
5 | | http://www.apache.org/licenses/LICENSE-2.0 |
6 | | Unless required by applicable law or agreed to in writing, software |
7 | | distributed under the License is distributed on an "AS IS" BASIS, |
8 | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
9 | | See the License for the specific language governing permissions and |
10 | | limitations under the License. |
11 | | */ |
12 | | |
13 | | |
14 | | #include "config.h" |
15 | | #include "syshead.h" |
16 | | #include "misc.h" |
17 | | #include "buffer.h" |
18 | | |
19 | | #include "fuzz_randomizer.h" |
20 | | |
21 | 2.48k | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
22 | 2.48k | fuzz_random_init(data,size); |
23 | | |
24 | 2.48k | struct gc_arena gc; |
25 | 2.48k | struct buffer *bufp; |
26 | 2.48k | struct buffer buf, buf2; |
27 | 2.48k | struct buffer_list *buflistp = NULL; |
28 | 2.48k | ssize_t generic_ssizet, _size; |
29 | 2.48k | char *tmp; |
30 | 2.48k | char *tmp2; |
31 | 2.48k | char match; |
32 | | |
33 | 2.48k | gc = gc_new(); |
34 | 2.48k | bufp = NULL; |
35 | | |
36 | 2.48k | int total_to_fuzz = fuzz_randomizer_get_int(1, 20); |
37 | 35.6k | for (int i = 0; i < total_to_fuzz; i++) { |
38 | 33.1k | if (bufp == NULL) { |
39 | 2.48k | generic_ssizet = fuzz_randomizer_get_int(0, 1); |
40 | 2.48k | if (generic_ssizet == 0) { |
41 | 1.34k | _size = fuzz_randomizer_get_int(0, 100); |
42 | 1.34k | buf = alloc_buf_gc(_size, &gc); |
43 | 1.34k | bufp = &buf; |
44 | 1.34k | } else { |
45 | 1.13k | tmp = get_random_string(); |
46 | 1.13k | buf = string_alloc_buf(tmp, &gc); |
47 | 1.13k | bufp = &buf; |
48 | 1.13k | free(tmp); |
49 | 1.13k | tmp = NULL; |
50 | 1.13k | } |
51 | 30.6k | } else { |
52 | 30.6k | #define NUM_TARGETS 31 |
53 | 30.6k | generic_ssizet = fuzz_randomizer_get_int(0, NUM_TARGETS); |
54 | 30.6k | switch (generic_ssizet) { |
55 | 24.1k | case 0: |
56 | 24.1k | buf_clear(bufp); |
57 | 24.1k | break; |
58 | 252 | case 1: |
59 | 252 | buf2 = clone_buf(bufp); |
60 | 252 | free_buf(&buf2); |
61 | 252 | break; |
62 | 110 | case 2: |
63 | 110 | buf_defined(bufp); |
64 | 110 | break; |
65 | 191 | case 3: |
66 | 191 | buf_valid(bufp); |
67 | 191 | break; |
68 | 138 | case 4: |
69 | 138 | buf_bptr(bufp); |
70 | 138 | break; |
71 | 44 | case 5: |
72 | 44 | buf_len(bufp); |
73 | 44 | break; |
74 | 69 | case 6: |
75 | 69 | buf_bend(bufp); |
76 | 69 | break; |
77 | 120 | case 7: |
78 | 120 | buf_blast(bufp); |
79 | 120 | break; |
80 | 102 | case 8: |
81 | 102 | buf_str(bufp); |
82 | 102 | break; |
83 | 203 | case 9: |
84 | 203 | generic_ssizet = fuzz_randomizer_get_int(0, 255); |
85 | 203 | buf_rmtail(bufp, (uint8_t)generic_ssizet); |
86 | 203 | break; |
87 | 565 | case 10: |
88 | 565 | buf_chomp(bufp); |
89 | 565 | break; |
90 | 113 | case 11: |
91 | 113 | tmp = get_random_string(); |
92 | 113 | skip_leading_whitespace(tmp); |
93 | 113 | free(tmp); |
94 | 113 | tmp = NULL; |
95 | 113 | break; |
96 | 127 | case 12: |
97 | 127 | tmp = get_random_string(); |
98 | 127 | chomp(tmp); |
99 | 127 | free(tmp); |
100 | 127 | tmp = NULL; |
101 | 127 | break; |
102 | 269 | case 13: |
103 | 269 | tmp = get_random_string(); |
104 | 269 | tmp2 = get_random_string(); |
105 | 269 | rm_trailing_chars(tmp, tmp2); |
106 | 269 | free(tmp); |
107 | 269 | free(tmp2); |
108 | 269 | tmp = NULL; |
109 | 269 | tmp2 = NULL; |
110 | 269 | break; |
111 | 42 | case 14: |
112 | 42 | tmp = get_random_string(); |
113 | 42 | string_clear(tmp); |
114 | 42 | free(tmp); |
115 | 42 | tmp = NULL; |
116 | 42 | break; |
117 | 327 | case 15: |
118 | 327 | tmp = get_random_string(); |
119 | 327 | buf_string_match_head_str(bufp, tmp); |
120 | 327 | free(tmp); |
121 | 327 | tmp = NULL; |
122 | 327 | break; |
123 | 416 | case 16: |
124 | 416 | tmp = get_random_string(); |
125 | 416 | buf_string_compare_advance(bufp, tmp); |
126 | 416 | free(tmp); |
127 | 416 | tmp = NULL; |
128 | 416 | break; |
129 | 345 | case 17: |
130 | 345 | generic_ssizet = fuzz_randomizer_get_int(0, 255); |
131 | | |
132 | 345 | tmp = get_random_string(); |
133 | 345 | if (strlen(tmp) > 0) { |
134 | 296 | buf_parse(bufp, (int)generic_ssizet, tmp, strlen(tmp)); |
135 | 296 | } |
136 | | |
137 | 345 | free(tmp); |
138 | 345 | tmp = NULL; |
139 | 345 | break; |
140 | 550 | case 18: |
141 | 550 | tmp = get_random_string(); |
142 | 550 | string_mod(tmp, fuzz_randomizer_get_int(0, 12312), |
143 | 550 | fuzz_randomizer_get_int(0, 23141234), |
144 | 550 | (char)fuzz_randomizer_get_int(0, 255)); |
145 | | |
146 | 550 | free(tmp); |
147 | 550 | tmp = NULL; |
148 | 550 | break; |
149 | 170 | case 19: |
150 | 170 | tmp = get_random_string(); |
151 | 170 | match = (char)fuzz_randomizer_get_int(0, 255); |
152 | 170 | if (match != 0) { |
153 | 134 | string_replace_leading(tmp, match, (char)fuzz_randomizer_get_int(0, 255)); |
154 | 134 | } |
155 | | |
156 | 170 | free(tmp); |
157 | 170 | tmp = NULL; |
158 | 170 | break; |
159 | 224 | case 20: |
160 | 224 | tmp = get_random_string(); |
161 | 224 | buf_write(bufp, tmp, strlen(tmp)); |
162 | | |
163 | 224 | free(tmp); |
164 | 224 | tmp = NULL; |
165 | 224 | break; |
166 | 175 | case 21: |
167 | 175 | tmp = get_random_string(); |
168 | | |
169 | 175 | buf_write_prepend(bufp, tmp, strlen(tmp)); |
170 | | |
171 | 175 | free(tmp); |
172 | 175 | tmp = NULL; |
173 | 175 | break; |
174 | 212 | case 22: |
175 | 212 | buf_write_u8(bufp, fuzz_randomizer_get_int(0, 255)); |
176 | 212 | break; |
177 | 186 | case 23: |
178 | 186 | buf_write_u16(bufp, fuzz_randomizer_get_int(0, 1024)); |
179 | 186 | break; |
180 | 241 | case 24: |
181 | 241 | buf_write_u32(bufp, fuzz_randomizer_get_int(0, 12312)); |
182 | 241 | break; |
183 | 281 | case 25: |
184 | 281 | tmp = get_random_string(); |
185 | 281 | buf_catrunc(bufp, tmp); |
186 | 281 | free(tmp); |
187 | 281 | tmp = NULL; |
188 | 281 | break; |
189 | 149 | case 26: |
190 | 149 | tmp = get_random_string(); |
191 | 149 | buf_puts(bufp, tmp); |
192 | 149 | free(tmp); |
193 | 149 | tmp = NULL; |
194 | 149 | break; |
195 | 196 | case 27: |
196 | 196 | buf_advance(bufp, fuzz_randomizer_get_int(0, 25523)); |
197 | 196 | break; |
198 | 280 | case 28: |
199 | 280 | buf_prepend(bufp, fuzz_randomizer_get_int(0, 251235)); |
200 | 280 | break; |
201 | 33 | case 29: |
202 | 33 | buf_reverse_capacity(bufp); |
203 | 33 | break; |
204 | 102 | case 30: |
205 | 102 | buf_forward_capacity_total(bufp); |
206 | 102 | break; |
207 | 361 | case 31: |
208 | 361 | buf_forward_capacity(bufp); |
209 | 361 | break; |
210 | 30.6k | } |
211 | 30.6k | } |
212 | | |
213 | 33.1k | if (buflistp == NULL) { |
214 | 15.6k | buflistp = buffer_list_new(); |
215 | 17.4k | } else { |
216 | 17.4k | #define NUM_LIST_TARGETS 6 |
217 | 17.4k | generic_ssizet = fuzz_randomizer_get_int(0, NUM_LIST_TARGETS); |
218 | 17.4k | switch (generic_ssizet) { |
219 | 14.4k | case 0: |
220 | 14.4k | buffer_list_free(buflistp); |
221 | 14.4k | buflistp = NULL; |
222 | 14.4k | break; |
223 | 415 | case 1: |
224 | 415 | buffer_list_defined(buflistp); |
225 | 415 | break; |
226 | 851 | case 2: |
227 | 851 | tmp = get_random_string(); |
228 | 851 | if (strlen(tmp) < BUF_SIZE_MAX) { |
229 | 846 | buffer_list_push(buflistp, tmp); |
230 | 846 | } |
231 | 851 | free(tmp); |
232 | 851 | tmp = NULL; |
233 | 851 | break; |
234 | 691 | case 3: |
235 | 691 | buffer_list_peek(buflistp); |
236 | 691 | break; |
237 | 255 | case 4: |
238 | 255 | buffer_list_pop(buflistp); |
239 | 255 | break; |
240 | 284 | case 5: |
241 | 284 | tmp = get_random_string(); |
242 | 284 | buffer_list_aggregate_separator( |
243 | 284 | buflistp, fuzz_randomizer_get_int(0, 1024), tmp); |
244 | | |
245 | 284 | free(tmp); |
246 | 284 | tmp = NULL; |
247 | 284 | break; |
248 | 549 | case 6: |
249 | 549 | buffer_list_aggregate(buflistp, |
250 | 549 | fuzz_randomizer_get_int(0, 1024)); |
251 | 549 | break; |
252 | 17.4k | } |
253 | 17.4k | } |
254 | 33.1k | } |
255 | | |
256 | | // Cleanup |
257 | 2.48k | buffer_list_free(buflistp); |
258 | 2.48k | gc_free(&gc); |
259 | | |
260 | 2.48k | fuzz_random_destroy(); |
261 | | |
262 | 2.48k | return 0; |
263 | 2.48k | } |