/src/cmark/test/cmark-fuzz.c
Line | Count | Source |
1 | | #include <stdint.h> |
2 | | #include <stdlib.h> |
3 | | #include <string.h> |
4 | | #include "cmark.h" |
5 | | |
6 | 42.5k | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
7 | 42.5k | struct __attribute__((packed)) { |
8 | 42.5k | int options; |
9 | 42.5k | int width; |
10 | 42.5k | } fuzz_config; |
11 | | |
12 | 42.5k | if (size >= sizeof(fuzz_config)) { |
13 | | /* The beginning of `data` is treated as fuzzer configuration */ |
14 | 42.5k | memcpy(&fuzz_config, data, sizeof(fuzz_config)); |
15 | | |
16 | | /* Mask off valid option bits */ |
17 | 42.5k | fuzz_config.options &= (CMARK_OPT_SOURCEPOS | CMARK_OPT_HARDBREAKS | CMARK_OPT_UNSAFE | CMARK_OPT_NOBREAKS | CMARK_OPT_NORMALIZE | CMARK_OPT_VALIDATE_UTF8 | CMARK_OPT_SMART); |
18 | | |
19 | | /* Remainder of input is the markdown */ |
20 | 42.5k | const char *markdown = (const char *)(data + sizeof(fuzz_config)); |
21 | 42.5k | const size_t markdown_size = size - sizeof(fuzz_config); |
22 | 42.5k | cmark_node *doc = cmark_parse_document(markdown, markdown_size, fuzz_config.options); |
23 | | |
24 | 42.5k | free(cmark_render_commonmark(doc, fuzz_config.options, fuzz_config.width)); |
25 | 42.5k | free(cmark_render_html(doc, fuzz_config.options)); |
26 | 42.5k | free(cmark_render_latex(doc, fuzz_config.options, fuzz_config.width)); |
27 | 42.5k | free(cmark_render_man(doc, fuzz_config.options, fuzz_config.width)); |
28 | 42.5k | free(cmark_render_xml(doc, fuzz_config.options)); |
29 | | |
30 | 42.5k | cmark_node_free(doc); |
31 | 42.5k | } |
32 | 42.5k | return 0; |
33 | 42.5k | } |