Skip to content

Commit 27b1b68

Browse files
authored
libmicrohttpd2: Add more fuzzing target from mhd_str (#13857)
This PR adds the final batch of target from mhd_str for project libmicrohttpd2. Signed-off-by: Arthur Chan <[email protected]>
1 parent 52ee750 commit 27b1b68

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

projects/libmicrohttpd2/fuzz_str.cpp

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ static void fuzz_tokens(FuzzedDataProvider& fdp) {
3939
size_t payload_size2 = payload2.size();
4040
size_t payload_size3 = payload3.size();
4141

42+
// Fuzz mhd_str_equal_caseless
43+
mhd_str_equal_caseless(payload_str1, payload_str2);
44+
4245
// Fuzz mhd_str_equal_caseless_n
4346
mhd_str_equal_caseless_n(payload_str1, payload_str2, fdp.ConsumeIntegral<size_t>());
4447

@@ -142,20 +145,21 @@ static void fuzz_quoted(FuzzedDataProvider& fdp) {
142145
// Fuzz mhd_str_equal_quoted_bin_n with random string payload as binary
143146
mhd_str_equal_quoted_bin_n(payload_str1, payload_size1, payload_str2, payload_size2);
144147

145-
// Fuzz mhd_str_quote with random string payload
148+
// Fuzz mhd_str_quote and mhd_str_unquote with random string payload
146149
size_t max_out = payload_size1 * 2;
147150
char *out = (char*) malloc(max_out);
148151
if (out) {
149152
mhd_str_quote(payload_str1, payload_size1, out, max_out);
153+
mhd_str_unquote(payload_str1, payload_size1, out);
150154
}
151155
free(out);
152156

153157
max_out = payload_size2 * 2;
154158
out = (char*) malloc(max_out);
155159
if (out) {
156160
mhd_str_quote(payload_str2, payload_size2, out, max_out);
161+
mhd_str_unquote(payload_str2, payload_size2, out);
157162
}
158-
159163
free(out);
160164
}
161165

@@ -194,17 +198,49 @@ static void fuzz_transformation(FuzzedDataProvider& fdp) {
194198
}
195199
}
196200

201+
static void fuzz_hex_conversion(FuzzedDataProvider& fdp) {
202+
// Prepare random data for hex conversion
203+
std::string payload = fdp.ConsumeRandomLengthString(1024);
204+
char *payload_str = payload.data();
205+
size_t payload_size = payload.size();
206+
207+
// Fuzz mhd_hex_to_bin with random payload
208+
uint8_t *bin_out = (uint8_t*) malloc(payload_size);
209+
if (bin_out) {
210+
mhd_hex_to_bin(payload_str, payload_size, bin_out);
211+
free(bin_out);
212+
}
213+
214+
// Fuzz mhd_bin_to_hex with random payload
215+
char *hex_out = (char *) malloc(payload_size * 2);
216+
if (hex_out) {
217+
if (!payload.empty()) {
218+
mhd_bin_to_hex(payload_str, payload_size, hex_out);
219+
}
220+
free(hex_out);
221+
}
222+
223+
char *hexz_out = (char *) malloc(payload_size * 2 + 1);
224+
if (hexz_out) {
225+
if (!payload.empty()) {
226+
mhd_bin_to_hex(payload_str, payload_size, hexz_out);
227+
}
228+
free(hexz_out);
229+
}
230+
}
231+
197232
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
198233
FuzzedDataProvider fdp(data, size);
199234

200235
for (int i = 0; i < fdp.ConsumeIntegralInRange<unsigned>(1, 6); i++) {
201-
switch (fdp.ConsumeIntegralInRange<int>(0, 6)) {
236+
switch (fdp.ConsumeIntegralInRange<int>(0, 7)) {
202237
case 0: fuzz_tokens(fdp); break;
203238
case 1: fuzz_conversion(fdp); break;
204239
case 2: fuzz_decode(fdp); break;
205240
case 3: fuzz_quoted(fdp); break;
206241
case 4: fuzz_base64(fdp); break;
207242
case 5: fuzz_transformation(fdp); break;
243+
case 6: fuzz_hex_conversion(fdp); break;
208244
}
209245
}
210246
return 0;

0 commit comments

Comments
 (0)