diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-02-22 14:28:08 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-02-25 12:35:51 +0900 |
commit | a378400b3fac41b6d41f5ee52057c397ad82a55a (patch) | |
tree | 23512638d509f102dcaff102556f9d7b111ccd77 /src/udev | |
parent | 7cd1f60df0608597e954508b371b42df37d2e9c8 (diff) | |
download | systemd-a378400b3fac41b6d41f5ee52057c397ad82a55a.tar.gz |
fuzz: add fuzzer for parsing .link files
This also renames load_link() to link_load_one()
Diffstat (limited to 'src/udev')
-rw-r--r-- | src/udev/meson.build | 11 | ||||
-rw-r--r-- | src/udev/net/fuzz-link-parser.c | 25 | ||||
-rw-r--r-- | src/udev/net/link-config.c | 6 | ||||
-rw-r--r-- | src/udev/net/link-config.h | 2 |
4 files changed, 40 insertions, 4 deletions
diff --git a/src/udev/meson.build b/src/udev/meson.build index 9d3f6d1c56..2de88c0d93 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -197,3 +197,14 @@ configure_file( meson.add_install_script('sh', '-c', mkdir_p.format(join_paths(sysconfdir, 'udev/rules.d'))) + +fuzzers += [ + [['src/udev/net/fuzz-link-parser.c', + 'src/fuzz/fuzz.h'], + [libudev_core, + libudev_static, + libsystemd_network, + libshared], + [threads, + libacl]] + ] diff --git a/src/udev/net/fuzz-link-parser.c b/src/udev/net/fuzz-link-parser.c new file mode 100644 index 0000000000..397fa2c16e --- /dev/null +++ b/src/udev/net/fuzz-link-parser.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ + +#include "fd-util.h" +#include "fs-util.h" +#include "fuzz.h" +#include "link-config.h" +#include "tmpfile-util.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + _cleanup_(link_config_ctx_freep) link_config_ctx *ctx = NULL; + _cleanup_(unlink_tempfilep) char filename[] = "/tmp/fuzz-link-config.XXXXXX"; + _cleanup_fclose_ FILE *f = NULL; + + if (!getenv("SYSTEMD_LOG_LEVEL")) + log_set_max_level(LOG_CRIT); + + assert_se(fmkostemp_safe(filename, "r+", &f) == 0); + if (size != 0) + assert_se(fwrite(data, size, 1, f) == 1); + + fflush(f); + assert_se(link_config_ctx_new(&ctx) >= 0); + (void) link_load_one(ctx, filename); + return 0; +} diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index aa3e7eeae3..f1d36ccac0 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -94,8 +94,6 @@ void link_config_ctx_free(link_config_ctx *ctx) { return; } -DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free); - int link_config_ctx_new(link_config_ctx **ret) { _cleanup_(link_config_ctx_freep) link_config_ctx *ctx = NULL; @@ -117,7 +115,7 @@ int link_config_ctx_new(link_config_ctx **ret) { return 0; } -static int load_link(link_config_ctx *ctx, const char *filename) { +int link_load_one(link_config_ctx *ctx, const char *filename) { _cleanup_(link_config_freep) link_config *link = NULL; _cleanup_fclose_ FILE *file = NULL; _cleanup_free_ char *name = NULL; @@ -224,7 +222,7 @@ int link_config_load(link_config_ctx *ctx) { return log_error_errno(r, "failed to enumerate link files: %m"); STRV_FOREACH_BACKWARDS(f, files) { - r = load_link(ctx, *f); + r = link_load_one(ctx, *f); if (r < 0) log_error_errno(r, "Failed to load %s, ignoring: %m", *f); } diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index 1113b1052e..4335b593d1 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -67,7 +67,9 @@ struct link_config { int link_config_ctx_new(link_config_ctx **ret); void link_config_ctx_free(link_config_ctx *ctx); +DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free); +int link_load_one(link_config_ctx *ctx, const char *filename); int link_config_load(link_config_ctx *ctx); bool link_config_should_reload(link_config_ctx *ctx); |