Coverage Report

Created: 2026-10-28 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fuzz_utils.c
Line
Count
Source
1
/* Copyright 2026 Google LLC
2
3
Licensed under the Apache License, Version 2.0 (the "License");
4
you may not use this file except in compliance with the License.
5
You may obtain a copy of the License at
6
7
      http://www.apache.org/licenses/LICENSE-2.0
8
9
Unless required by applicable law or agreed to in writing, software
10
distributed under the License is distributed on an "AS IS" BASIS,
11
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
See the License for the specific language governing permissions and
13
limitations under the License.
14
*/
15
16
#include <stdio.h>
17
#include <stdlib.h>
18
#include <stdint.h>
19
#include <string.h>
20
21
#include "first.h"
22
#include "buffer.h"
23
#include "base64.h"
24
25
/* buffer_is_valid_UTF8() is __attribute_pure__: a discarded result removes the call */
26
static volatile int utf8_sink;
27
28
1.70k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
29
1.70k
    if (size < 2) {
30
1
        return 0;
31
1
    }
32
33
1.70k
    uint8_t action = data[0];
34
1.70k
    data++;
35
1.70k
    size--;
36
37
1.70k
    buffer *b = buffer_init();
38
1.70k
    buffer_copy_string_len(b, (const char *)data, size);
39
40
1.70k
    switch (action % 12) {
41
166
        case 0:
42
166
            buffer_urldecode_path(b);
43
166
            break;
44
228
        case 1:
45
228
            buffer_path_simplify(b);
46
228
            break;
47
247
        case 2:
48
247
            utf8_sink = buffer_is_valid_UTF8(b);
49
247
            break;
50
50
        case 3:
51
50
            buffer_to_lower(b);
52
50
            break;
53
48
        case 4:
54
48
            buffer_to_upper(b);
55
48
            break;
56
39
        case 5:
57
39
            {
58
39
                buffer *dest = buffer_init();
59
39
                buffer_append_string_encoded(dest, b->ptr, buffer_clen(b), ENCODING_REL_URI);
60
39
                buffer_free(dest);
61
39
            }
62
39
            break;
63
145
        case 6:
64
145
            {
65
145
                buffer *dest = buffer_init();
66
145
                buffer_append_string_encoded(dest, b->ptr, buffer_clen(b), ENCODING_HTML);
67
145
                buffer_free(dest);
68
145
            }
69
145
            break;
70
152
        case 7:
71
152
            {
72
152
                buffer *dest = buffer_init();
73
152
                buffer_append_string_c_escaped(dest, b->ptr, buffer_clen(b));
74
152
                buffer_free(dest);
75
152
            }
76
152
            break;
77
176
        case 8:
78
176
            {
79
176
                buffer *dest = buffer_init();
80
176
                buffer_append_bs_escaped(dest, b->ptr, buffer_clen(b));
81
176
                buffer_free(dest);
82
176
            }
83
176
            break;
84
240
        case 9:
85
240
            {
86
240
                buffer *dest = buffer_init();
87
240
                buffer_append_bs_escaped_json(dest, b->ptr, buffer_clen(b));
88
240
                buffer_free(dest);
89
240
            }
90
240
            break;
91
79
        case 10:
92
79
            {
93
79
                buffer *dest = buffer_init();
94
79
                buffer_append_base64_enc(dest, (const unsigned char *)b->ptr, buffer_clen(b), BASE64_STANDARD, 1);
95
79
                buffer_free(dest);
96
79
            }
97
79
            break;
98
135
        case 11:
99
135
            {
100
135
                buffer *dest = buffer_init();
101
135
                buffer_append_base64_decode(dest, b->ptr, buffer_clen(b), BASE64_STANDARD);
102
135
                buffer_free(dest);
103
135
            }
104
135
            break;
105
1.70k
    }
106
107
1.70k
    buffer_free(b);
108
109
1.70k
    return 0;
110
1.70k
}