Coverage Report

Created: 2026-10-17 07: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.69k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
29
1.69k
    if (size < 2) {
30
1
        return 0;
31
1
    }
32
33
1.69k
    uint8_t action = data[0];
34
1.69k
    data++;
35
1.69k
    size--;
36
37
1.69k
    buffer *b = buffer_init();
38
1.69k
    buffer_copy_string_len(b, (const char *)data, size);
39
40
1.69k
    switch (action % 12) {
41
165
        case 0:
42
165
            buffer_urldecode_path(b);
43
165
            break;
44
224
        case 1:
45
224
            buffer_path_simplify(b);
46
224
            break;
47
254
        case 2:
48
254
            utf8_sink = buffer_is_valid_UTF8(b);
49
254
            break;
50
46
        case 3:
51
46
            buffer_to_lower(b);
52
46
            break;
53
49
        case 4:
54
49
            buffer_to_upper(b);
55
49
            break;
56
41
        case 5:
57
41
            {
58
41
                buffer *dest = buffer_init();
59
41
                buffer_append_string_encoded(dest, b->ptr, buffer_clen(b), ENCODING_REL_URI);
60
41
                buffer_free(dest);
61
41
            }
62
41
            break;
63
150
        case 6:
64
150
            {
65
150
                buffer *dest = buffer_init();
66
150
                buffer_append_string_encoded(dest, b->ptr, buffer_clen(b), ENCODING_HTML);
67
150
                buffer_free(dest);
68
150
            }
69
150
            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
167
        case 8:
78
167
            {
79
167
                buffer *dest = buffer_init();
80
167
                buffer_append_bs_escaped(dest, b->ptr, buffer_clen(b));
81
167
                buffer_free(dest);
82
167
            }
83
167
            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
76
        case 10:
92
76
            {
93
76
                buffer *dest = buffer_init();
94
76
                buffer_append_base64_enc(dest, (const unsigned char *)b->ptr, buffer_clen(b), BASE64_STANDARD, 1);
95
76
                buffer_free(dest);
96
76
            }
97
76
            break;
98
129
        case 11:
99
129
            {
100
129
                buffer *dest = buffer_init();
101
129
                buffer_append_base64_decode(dest, b->ptr, buffer_clen(b), BASE64_STANDARD);
102
129
                buffer_free(dest);
103
129
            }
104
129
            break;
105
1.69k
    }
106
107
1.69k
    buffer_free(b);
108
109
1.69k
    return 0;
110
1.69k
}