diff --git a/fuzzers/README.md b/fuzzers/README.md index 2dc91cd63b..4c7ca5ecbf 100644 --- a/fuzzers/README.md +++ b/fuzzers/README.md @@ -1,18 +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 +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 index ab17b577fd..579f34c8c7 100644 --- a/fuzzers/cib_file_fuzzer.c +++ b/fuzzers/cib_file_fuzzer.c @@ -1,36 +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[256]; +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *filename; + int fd; // Have at least some data if (size < 5) { return 0; } - sprintf(filename, "/tmp/libfuzzer.%d", getpid()); - - FILE *fp = fopen(filename, "wb"); - if (!fp) + filename = crm_strdup_printf("%s/libfuzzer.XXXXXX", pcmk__get_tmpdir()); + fd = mkstemp(filename); + if (fd == -1) { return 0; - fwrite(data, size, 1, fp); - fclose(fp); + } + write(fd, data, size); + close(fd); - cib_file_read_and_verify(filename, filename, NULL); + 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 index b6eb30c565..5d719ce7cb 100644 --- a/fuzzers/iso8601_fuzzer.c +++ b/fuzzers/iso8601_fuzzer.c @@ -1,36 +1,47 @@ /* * 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" +#include +#include +#include + + +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; + char *result; + time_t epoch; + pcmk__time_hr_t *now; -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { // Ensure we have enough data. if (size < 10) { return 0; } - char *ns = malloc(size+1); + 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; + epoch = 0; + now = NULL; now = pcmk__time_hr_now(&epoch); - pcmk__time_format_hr(ns, now); + result = pcmk__time_format_hr(ns, now); + if (result == NULL) { + free(result); + } free(ns); return 0; } diff --git a/fuzzers/strings_fuzzer.c b/fuzzers/strings_fuzzer.c index 6d521632f8..91b09cbaf0 100644 --- a/fuzzers/strings_fuzzer.c +++ b/fuzzers/strings_fuzzer.c @@ -1,32 +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 -#include "strings.h" +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; + guint res; -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (size < 10) { return 0; } - char *ns = malloc(size+1); + ns = malloc(size+1); memcpy(ns, data, size); ns[size] = '\0'; pcmk_numeric_strcasecmp(ns, ns); - pcmk__trim(ns, "asdfasdf"); - guint res; + 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 index 4c57728889..2bf79801c2 100644 --- a/fuzzers/utils_fuzzer.c +++ b/fuzzers/utils_fuzzer.c @@ -1,30 +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 -#include "util.h" -#include "util_compat.h" - -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { +int +LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + char *ns; if (size < 10) { return 0; } - char *ns = malloc(size+1); + ns = malloc(size+1); memcpy(ns, data, size); ns[size] = '\0'; crm_parse_interval_spec(ns); free(ns); return 0; }