]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: make network_load_one "public" and add a fuzzer for it
authorEvgeny Vereshchagin <evvers@ya.ru>
Sun, 4 Nov 2018 21:27:07 +0000 (22:27 +0100)
committerEvgeny Vereshchagin <evvers@ya.ru>
Tue, 6 Nov 2018 18:01:32 +0000 (19:01 +0100)
src/network/fuzz-network-parser.c [new file with mode: 0644]
src/network/meson.build
src/network/networkd-network.c
src/network/networkd-network.h

diff --git a/src/network/fuzz-network-parser.c b/src/network/fuzz-network-parser.c
new file mode 100644 (file)
index 0000000..bfeb46c
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "fuzz.h"
+#include "networkd-manager.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+        _cleanup_(manager_freep) Manager *manager = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_(unlink_tempfilep) char network_config[] = "/tmp/fuzz-networkd.XXXXXX";
+
+        assert_se(fmkostemp_safe(network_config, "r+", &f) == 0);
+        if (size != 0)
+                assert_se(fwrite(data, size, 1, f) == 1);
+
+        rewind(f);
+        assert_se(manager_new(&manager) >= 0);
+        (void) network_load_one(manager, network_config);
+        return 0;
+}
index db03e2234ffbef8bb03e7cc72160f40be48734ee..d4fa27a288ff5a8919b24521b0a666eece26e8a2 100644 (file)
@@ -144,6 +144,14 @@ if conf.get('ENABLE_NETWORKD') == 1
       libsystemd_network,
       libshared],
      [threads]],
+
+    [['src/network/fuzz-network-parser.c',
+      'src/fuzz/fuzz.h'],
+     [libnetworkd_core,
+      libudev_static,
+      libsystemd_network,
+      libshared],
+     [threads]]
     ]
 
         tests += [
index d6d59bab43f9fd02cbab6476c521c17730da092e..f257ac6698bf94dcb09502c5bdb752c2bff15e46 100644 (file)
@@ -102,7 +102,7 @@ void network_apply_anonymize_if_set(Network *network) {
         network->dhcp_use_timezone = false;
 }
 
-static int network_load_one(Manager *manager, const char *filename) {
+int network_load_one(Manager *manager, const char *filename) {
         _cleanup_(network_freep) Network *network = NULL;
         _cleanup_fclose_ FILE *file = NULL;
         char *d;
index 495fac83d38d421cd11b455dadbfc9bd21dedc2d..919a2c4b3c4e9a4dd26096565753334639dfb648 100644 (file)
@@ -272,6 +272,7 @@ void network_free(Network *network);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
 
 int network_load(Manager *manager);
+int network_load_one(Manager *manager, const char *filename);
 
 int network_get_by_name(Manager *manager, const char *name, Network **ret);
 int network_get(Manager *manager, sd_device *device, const char *ifname, const struct ether_addr *mac, Network **ret);