Coverage Report

Created: 2023-05-30 07:02

/src/fuzz_buffer.c
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
1
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
22
1
  fuzz_random_init(data,size);
23
24
1
  struct gc_arena gc;
25
1
  struct buffer *bufp;
26
1
  struct buffer buf, buf2;
27
1
  struct buffer_list *buflistp = NULL;
28
1
  ssize_t generic_ssizet, _size;
29
1
  char *tmp;
30
1
  char *tmp2;
31
1
  char match;
32
33
1
  gc = gc_new();
34
1
  bufp = NULL;
35
36
1
  int total_to_fuzz = fuzz_randomizer_get_int(1, 20);
37
13
  for (int i = 0; i < total_to_fuzz; i++) {
38
12
    if (bufp == NULL) {
39
1
      generic_ssizet = fuzz_randomizer_get_int(0, 1);
40
1
      if (generic_ssizet == 0) {
41
1
        _size = fuzz_randomizer_get_int(0, 100);
42
1
        buf = alloc_buf_gc(_size, &gc);
43
1
        bufp = &buf;
44
1
      } else {
45
0
        tmp = get_random_string();
46
0
        buf = string_alloc_buf(tmp, &gc);
47
0
        bufp = &buf;
48
0
        free(tmp);
49
0
        tmp = NULL;
50
0
      }
51
11
    } else {
52
11
#define NUM_TARGETS 32
53
11
      generic_ssizet = fuzz_randomizer_get_int(0, NUM_TARGETS);
54
11
      switch (generic_ssizet) {
55
0
      case 0:
56
0
        buf_clear(bufp);
57
0
        break;
58
0
      case 1:
59
0
        buf2 = clone_buf(bufp);
60
0
        free_buf(&buf2);
61
0
        break;
62
0
      case 2:
63
0
        buf_defined(bufp);
64
0
        break;
65
1
      case 3:
66
1
        buf_valid(bufp);
67
1
        break;
68
1
      case 4:
69
1
        buf_bptr(bufp);
70
1
        break;
71
0
      case 5:
72
0
        buf_len(bufp);
73
0
        break;
74
1
      case 6:
75
1
        buf_bend(bufp);
76
1
        break;
77
0
      case 7:
78
0
        buf_blast(bufp);
79
0
        break;
80
1
      case 8:
81
1
        buf_str(bufp);
82
1
        break;
83
0
      case 9:
84
0
        generic_ssizet = fuzz_randomizer_get_int(0, 255);
85
0
        buf_rmtail(bufp, (uint8_t)generic_ssizet);
86
0
        break;
87
1
      case 10:
88
1
        buf_chomp(bufp);
89
1
        break;
90
0
      case 11:
91
0
        tmp = get_random_string();
92
0
        skip_leading_whitespace(tmp);
93
0
        free(tmp);
94
0
        tmp = NULL;
95
0
        break;
96
0
      case 12:
97
0
        tmp = get_random_string();
98
0
        chomp(tmp);
99
0
        free(tmp);
100
0
        tmp = NULL;
101
0
        break;
102
1
      case 13:
103
1
        tmp = get_random_string();
104
1
        tmp2 = get_random_string();
105
1
        rm_trailing_chars(tmp, tmp2);
106
1
        free(tmp);
107
1
        free(tmp2);
108
1
        tmp = NULL;
109
1
        tmp2 = NULL;
110
1
        break;
111
0
      case 14:
112
0
        tmp = get_random_string();
113
0
        string_clear(tmp);
114
0
        free(tmp);
115
0
        tmp = NULL;
116
0
        break;
117
0
      case 15:
118
0
        tmp = get_random_string();
119
0
        buf_string_match_head_str(bufp, tmp);
120
0
        free(tmp);
121
0
        tmp = NULL;
122
0
        break;
123
0
      case 16:
124
0
        tmp = get_random_string();
125
0
        buf_string_compare_advance(bufp, tmp);
126
0
        free(tmp);
127
0
        tmp = NULL;
128
0
        break;
129
0
      case 17:
130
0
        generic_ssizet = fuzz_randomizer_get_int(0, 255);
131
132
0
        tmp = get_random_string();
133
0
        if (strlen(tmp) > 0) {
134
0
          buf_parse(bufp, (int)generic_ssizet, tmp, strlen(tmp));
135
0
        }
136
137
0
        free(tmp);
138
0
        tmp = NULL;
139
0
        break;
140
1
      case 18:
141
1
        tmp = get_random_string();
142
1
        string_mod(tmp, fuzz_randomizer_get_int(0, 12312),
143
1
                   fuzz_randomizer_get_int(0, 23141234),
144
1
                   (char)fuzz_randomizer_get_int(0, 255));
145
146
1
        free(tmp);
147
1
        tmp = NULL;
148
1
        break;
149
0
      case 19:
150
0
        tmp = get_random_string();
151
0
        match = (char)fuzz_randomizer_get_int(0, 255);
152
0
        if (match != 0) {
153
0
          string_replace_leading(tmp, match, (char)fuzz_randomizer_get_int(0, 255));
154
0
        }
155
156
0
        free(tmp);
157
0
        tmp = NULL;
158
0
        break;
159
0
      case 20:
160
0
        tmp = get_random_string();
161
0
        buf_write(bufp, tmp, strlen(tmp));
162
163
0
        free(tmp);
164
0
        tmp = NULL;
165
0
        break;
166
0
      case 21:
167
0
        tmp = get_random_string();
168
169
0
        buf_write_prepend(bufp, tmp, strlen(tmp));
170
171
0
        free(tmp);
172
0
        tmp = NULL;
173
0
        break;
174
0
      case 22:
175
0
        buf_write_u8(bufp, fuzz_randomizer_get_int(0, 255));
176
0
        break;
177
0
      case 23:
178
0
        buf_write_u16(bufp, fuzz_randomizer_get_int(0, 1024));
179
0
        break;
180
0
      case 24:
181
0
        buf_write_u32(bufp, fuzz_randomizer_get_int(0, 12312));
182
0
        break;
183
0
      case 25:
184
0
        tmp = get_random_string();
185
0
        buf_catrunc(bufp, tmp);
186
0
        free(tmp);
187
0
        tmp = NULL;
188
0
        break;
189
2
      case 26:
190
2
        convert_to_one_line(bufp);
191
2
        break;
192
0
      case 27:
193
0
        buf_advance(bufp, fuzz_randomizer_get_int(0, 25523));
194
0
        break;
195
0
      case 28:
196
0
        buf_prepend(bufp, fuzz_randomizer_get_int(0, 251235));
197
0
        break;
198
1
      case 29:
199
1
        buf_reverse_capacity(bufp);
200
1
        break;
201
0
      case 30:
202
0
        buf_forward_capacity_total(bufp);
203
0
        break;
204
1
      case 31:
205
1
        buf_forward_capacity(bufp);
206
1
        break;
207
0
      case 32:
208
0
        tmp = get_random_string();
209
0
        buf_puts(bufp, tmp);
210
0
        free(tmp);
211
0
        tmp = NULL;
212
0
        break;
213
11
      }
214
11
    }
215
216
12
    if (buflistp == NULL) {
217
1
      buflistp = buffer_list_new();
218
11
    } else {
219
11
#define NUM_LIST_TARGETS 6
220
11
      generic_ssizet = fuzz_randomizer_get_int(0, NUM_LIST_TARGETS);
221
11
      switch (generic_ssizet) {
222
0
      case 0:
223
0
        buffer_list_free(buflistp);
224
0
        buflistp = NULL;
225
0
        break;
226
2
      case 1:
227
2
        buffer_list_defined(buflistp);
228
2
        break;
229
3
      case 2:
230
3
        tmp = get_random_string();
231
3
        if (strlen(tmp) < BUF_SIZE_MAX) {
232
3
          buffer_list_push(buflistp, tmp);
233
3
        }
234
3
        free(tmp);
235
3
        tmp = NULL;
236
3
        break;
237
1
      case 3:
238
1
        buffer_list_peek(buflistp);
239
1
        break;
240
1
      case 4:
241
1
        buffer_list_pop(buflistp);
242
1
        break;
243
2
      case 5:
244
2
        tmp = get_random_string();
245
2
        buffer_list_aggregate_separator(
246
2
            buflistp, fuzz_randomizer_get_int(0, 1024), tmp);
247
248
2
        free(tmp);
249
2
        tmp = NULL;
250
2
        break;
251
2
      case 6:
252
2
        buffer_list_aggregate(buflistp,
253
2
                              fuzz_randomizer_get_int(0, 1024));
254
2
        break;
255
11
      }
256
11
    }
257
12
  }
258
259
  // Cleanup
260
1
  buffer_list_free(buflistp);
261
1
  gc_free(&gc);
262
263
1
  fuzz_random_destroy();
264
265
1
  return 0;
266
1
}