diff --git a/fuzzers/README.md b/fuzzers/README.md new file mode 100644 index 0000000000..2dc91cd63b --- /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 pacmaker 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..ab17b577fd --- /dev/null +++ b/fuzzers/cib_file_fuzzer.c @@ -0,0 +1,36 @@ +/* + * 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 + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + char filename[256]; + + // Have at least some data + if (size < 5) { + return 0; + } + + sprintf(filename, "/tmp/libfuzzer.%d", getpid()); + + FILE *fp = fopen(filename, "wb"); + if (!fp) + return 0; + fwrite(data, size, 1, fp); + fclose(fp); + + cib_file_read_and_verify(filename, filename, NULL); + + unlink(filename); + + return 0; +} diff --git a/fuzzers/iso8601_fuzzer.c b/fuzzers/iso8601_fuzzer.c new file mode 100644 index 0000000000..b6eb30c565 --- /dev/null +++ b/fuzzers/iso8601_fuzzer.c @@ -0,0 +1,36 @@ +/* + * 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 "util.h" +#include "iso8601.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // Ensure we have enough data. + if (size < 10) { + return 0; + } + char *ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + crm_time_parse_period(ns); + pcmk__time_hr_new(ns); + + + time_t epoch = 0; + pcmk__time_hr_t *now = NULL; + now = pcmk__time_hr_now(&epoch); + pcmk__time_format_hr(ns, now); + + free(ns); + return 0; +} diff --git a/fuzzers/strings_fuzzer.c b/fuzzers/strings_fuzzer.c new file mode 100644 index 0000000000..6d521632f8 --- /dev/null +++ b/fuzzers/strings_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 "strings.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < 10) { + return 0; + } + char *ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + pcmk_numeric_strcasecmp(ns, ns); + pcmk__trim(ns, "asdfasdf"); + guint res; + 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..4c57728889 --- /dev/null +++ b/fuzzers/utils_fuzzer.c @@ -0,0 +1,30 @@ +/* + * 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 "util.h" +#include "util_compat.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < 10) { + return 0; + } + char *ns = malloc(size+1); + memcpy(ns, data, size); + ns[size] = '\0'; + + crm_parse_interval_spec(ns); + + free(ns); + return 0; +}