diff --git a/fuzzers/README.md b/fuzzers/README.md new file mode 100644 index 0000000000..4c7ca5ecbf --- /dev/null +++ b/fuzzers/README.md @@ -0,0 +1,18 @@ +# OSS-Fuzz integration + +The fuzzers in this folder are used for our [OSS-Fuzz](https://github.com/google/oss-fuzz) +integration. + +To run this, you can follow the steps: + +```sh +git clone https://github.com/google/oss-fuzz +cd oss-fuzz +python3 infra/helper.py build_fuzzers pacemaker +python3 infra/helper.py run_fuzzer pacemaker utils_fuzzer +``` + + +## OSS-Fuzz logic + +The corresponding logic for Pacemaker on OSS-Fuzz can be found [here](https://github.com/google/oss-fuzz/tree/master/projects/pacemaker) diff --git a/fuzzers/cib_file_fuzzer.c b/fuzzers/cib_file_fuzzer.c new file mode 100644 index 0000000000..579f34c8c7 --- /dev/null +++ b/fuzzers/cib_file_fuzzer.c @@ -0,0 +1,41 @@ +/* + * Copyright 2024 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ +#include +#include +#include + +#include +#include + +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *filename; + int fd; + + // Have at least some data + if (size < 5) { + return 0; + } + + filename = crm_strdup_printf("%s/libfuzzer.XXXXXX", pcmk__get_tmpdir()); + fd = mkstemp(filename); + if (fd == -1) { + return 0; + } + write(fd, data, size); + close(fd); + + cib_file_read_and_verify(filename, NULL, NULL); + + unlink(filename); + free(filename); + + return 0; +} diff --git a/fuzzers/iso8601_fuzzer.c b/fuzzers/iso8601_fuzzer.c new file mode 100644 index 0000000000..cb83cb8f2a --- /dev/null +++ b/fuzzers/iso8601_fuzzer.c @@ -0,0 +1,45 @@ +/* + * Copyright 2024 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ +#include +#include +#include + +#include +#include +#include + + +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; + char *result; + time_t epoch; + pcmk__time_hr_t *now; + + // Ensure we have enough data. + if (size < 10) { + return 0; + } + ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + crm_time_parse_period(ns); + pcmk__time_hr_new(ns); + + epoch = 0; + now = NULL; + now = pcmk__time_hr_now(&epoch); + result = pcmk__time_format_hr(ns, now); + free(result); + + free(ns); + return 0; +} diff --git a/fuzzers/strings_fuzzer.c b/fuzzers/strings_fuzzer.c new file mode 100644 index 0000000000..91b09cbaf0 --- /dev/null +++ b/fuzzers/strings_fuzzer.c @@ -0,0 +1,38 @@ +/* + * Copyright 2024 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ +#include +#include +#include +#include +#include + +#include +#include + +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; + guint res; + + if (size < 10) { + return 0; + } + ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + pcmk_numeric_strcasecmp(ns, ns); + pcmk__trim(ns); + pcmk_parse_interval_spec(ns, &res); + crm_get_msec(ns); + + free(ns); + return 0; +} diff --git a/fuzzers/utils_fuzzer.c b/fuzzers/utils_fuzzer.c new file mode 100644 index 0000000000..2bf79801c2 --- /dev/null +++ b/fuzzers/utils_fuzzer.c @@ -0,0 +1,32 @@ +/* + * Copyright 2024 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ + +#include +#include +#include + +#include +#include + +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; + if (size < 10) { + return 0; + } + ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + crm_parse_interval_spec(ns); + + free(ns); + return 0; +}