From: Evgeny Vereshchagin Date: Sun, 4 Nov 2018 21:06:03 +0000 (+0100) Subject: networkd: make netdev_load_one "public" and add a fuzzer for it X-Git-Tag: v240~399^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e27aac11f26e6e42d14939e9348b2723f2d532ac;p=thirdparty%2Fsystemd.git networkd: make netdev_load_one "public" and add a fuzzer for it --- diff --git a/src/network/fuzz-netdev-parser.c b/src/network/fuzz-netdev-parser.c new file mode 100644 index 00000000000..adc85549e5a --- /dev/null +++ b/src/network/fuzz-netdev-parser.c @@ -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 netdev_config[] = "/tmp/fuzz-networkd.XXXXXX"; + + assert_se(fmkostemp_safe(netdev_config, "r+", &f) == 0); + if (size != 0) + assert_se(fwrite(data, size, 1, f) == 1); + + rewind(f); + assert_se(manager_new(&manager) >= 0); + (void) netdev_load_one(manager, netdev_config); + return 0; +} diff --git a/src/network/meson.build b/src/network/meson.build index 175d2f822cc..db03e2234ff 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -136,6 +136,16 @@ if conf.get('ENABLE_NETWORKD') == 1 install_data('networkd.conf', install_dir : pkgsysconfdir) + fuzzers += [ + [['src/network/fuzz-netdev-parser.c', + 'src/fuzz/fuzz.h'], + [libnetworkd_core, + libudev_static, + libsystemd_network, + libshared], + [threads]], + ] + tests += [ [['src/network/test-networkd-conf.c'], [libnetworkd_core, diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 52b40dd68e2..9ec16579e41 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -594,7 +594,7 @@ int netdev_join(NetDev *netdev, Link *link, sd_netlink_message_handler_t callbac return 0; } -static int netdev_load_one(Manager *manager, const char *filename) { +int netdev_load_one(Manager *manager, const char *filename) { _cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL; _cleanup_fclose_ FILE *file = NULL; const char *dropin_dirname; diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index 8c884bb124a..a1557bec418 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -146,6 +146,7 @@ extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX]; #define NETDEV(n) (&(n)->meta) int netdev_load(Manager *manager); +int netdev_load_one(Manager *manager, const char *filename); void netdev_drop(NetDev *netdev); NetDev *netdev_unref(NetDev *netdev); diff --git a/test/fuzz/fuzz-netdev-parser/11-dummy.netdev b/test/fuzz/fuzz-netdev-parser/11-dummy.netdev new file mode 100644 index 00000000000..6797eb4b09a --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/11-dummy.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=test1 +Kind=dummy diff --git a/test/fuzz/fuzz-netdev-parser/12-dummy.netdev b/test/fuzz/fuzz-netdev-parser/12-dummy.netdev new file mode 100644 index 00000000000..a7fdc0f7e01 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/12-dummy.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=dummy98 +Kind=dummy diff --git a/test/fuzz/fuzz-netdev-parser/21-macvlan.netdev b/test/fuzz/fuzz-netdev-parser/21-macvlan.netdev new file mode 100644 index 00000000000..e9a3c5b3479 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/21-macvlan.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=macvlan99 +Kind=macvlan diff --git a/test/fuzz/fuzz-netdev-parser/21-macvtap.netdev b/test/fuzz/fuzz-netdev-parser/21-macvtap.netdev new file mode 100644 index 00000000000..2c23aacfb2a --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/21-macvtap.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=macvtap99 +Kind=macvtap diff --git a/test/fuzz/fuzz-netdev-parser/21-vlan.netdev b/test/fuzz/fuzz-netdev-parser/21-vlan.netdev new file mode 100644 index 00000000000..fe9801c8a26 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/21-vlan.netdev @@ -0,0 +1,10 @@ +[NetDev] +Name=vlan99 +Kind=vlan + +[VLAN] +Id=99 +GVRP=true +MVRP=true +LooseBinding=true +ReorderHeader=true diff --git a/test/fuzz/fuzz-netdev-parser/25-bond-active-backup-slave.netdev b/test/fuzz/fuzz-netdev-parser/25-bond-active-backup-slave.netdev new file mode 100644 index 00000000000..1bbbf755705 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-bond-active-backup-slave.netdev @@ -0,0 +1,6 @@ +[NetDev] +Name=bond199 +Kind=bond + +[Bond] +Mode=active-backup diff --git a/test/fuzz/fuzz-netdev-parser/25-bond.netdev b/test/fuzz/fuzz-netdev-parser/25-bond.netdev new file mode 100644 index 00000000000..61c54c4de06 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-bond.netdev @@ -0,0 +1,18 @@ +[NetDev] +Name=bond99 +Kind=bond + +[Bond] +Mode=802.3ad +TransmitHashPolicy=layer3+4 +MIIMonitorSec=1s +LACPTransmitRate=fast +UpDelaySec=2s +DownDelaySec=2s +ResendIGMP=4 +MinLinks=1 +AdActorSysPrio=1218 +AdUserPortKey=811 +AdActorSystem=00:11:22:33:44:55 +# feed the sanitizer +AdActorSystem=00:11:22:33:44:55 diff --git a/test/fuzz/fuzz-netdev-parser/25-bridge.netdev b/test/fuzz/fuzz-netdev-parser/25-bridge.netdev new file mode 100644 index 00000000000..e23abd53682 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-bridge.netdev @@ -0,0 +1,13 @@ +[NetDev] +Name=bridge99 +Kind=bridge + +[Bridge] +HelloTimeSec=9 +MaxAgeSec=9 +ForwardDelaySec=9 +AgeingTimeSec=9 +Priority=9 +MulticastQuerier= true +MulticastSnooping=true +STP=true diff --git a/test/fuzz/fuzz-netdev-parser/25-geneve.netdev b/test/fuzz/fuzz-netdev-parser/25-geneve.netdev new file mode 100644 index 00000000000..279d71324ec --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-geneve.netdev @@ -0,0 +1,12 @@ +[NetDev] +Name=geneve99 +Kind=geneve + +[GENEVE] +Id=99 +Remote=192.168.22.1 +TTL=1 +UDPChecksum=true +UDP6ZeroChecksumTx=true +UDP6ZeroChecksumRx=true +DestinationPort=6082 diff --git a/test/fuzz/fuzz-netdev-parser/25-gre-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-gre-tunnel.netdev new file mode 100644 index 00000000000..94d9320cdbb --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-gre-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=gretun99 +Kind=gre + +[Tunnel] +Local=10.65.223.238 +Remote=10.65.223.239 diff --git a/test/fuzz/fuzz-netdev-parser/25-gretap-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-gretap-tunnel.netdev new file mode 100644 index 00000000000..769e7653e4c --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-gretap-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=gretap99 +Kind=gretap + +[Tunnel] +Local=10.65.223.238 +Remote=10.65.223.239 diff --git a/test/fuzz/fuzz-netdev-parser/25-ip6gre-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-ip6gre-tunnel.netdev new file mode 100644 index 00000000000..b16e0b4969e --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-ip6gre-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=ip6gretap99 +Kind=ip6gretap + +[Tunnel] +Local=2a00:ffde:4567:edde::4987 +Remote=2001:473:fece:cafe::5179 diff --git a/test/fuzz/fuzz-netdev-parser/25-ip6tnl-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-ip6tnl-tunnel.netdev new file mode 100644 index 00000000000..713e685ea16 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-ip6tnl-tunnel.netdev @@ -0,0 +1,8 @@ +[NetDev] +Name=ip6tnl99 +Kind=ip6tnl + +[Tunnel] +Mode=ip6ip6 +Local=2a00:ffde:4567:edde::4987 +Remote=2001:473:fece:cafe::5179 diff --git a/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel-independent.netdev b/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel-independent.netdev new file mode 100644 index 00000000000..36ff8d94297 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel-independent.netdev @@ -0,0 +1,9 @@ +[NetDev] +Name=ipiptun99 +Kind=ipip +MTUBytes=1480 + +[Tunnel] +Local=192.168.223.238 +Remote=192.169.224.239 +Independent=true diff --git a/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel.netdev new file mode 100644 index 00000000000..159ac727030 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-ipip-tunnel.netdev @@ -0,0 +1,8 @@ +[NetDev] +Name=ipiptun99 +Kind=ipip +MTUBytes=1480 + +[Tunnel] +Local=192.168.223.238 +Remote=192.169.224.239 diff --git a/test/fuzz/fuzz-netdev-parser/25-ipvlan.netdev b/test/fuzz/fuzz-netdev-parser/25-ipvlan.netdev new file mode 100644 index 00000000000..9921b787a13 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-ipvlan.netdev @@ -0,0 +1,6 @@ +[NetDev] +Name=ipvlan99 +Kind=ipvlan + +[IPVLAN] +Mode=L2 diff --git a/test/fuzz/fuzz-netdev-parser/25-sit-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-sit-tunnel.netdev new file mode 100644 index 00000000000..406d74bcf02 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-sit-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=sittun99 +Kind=sit + +[Tunnel] +Local=10.65.223.238 +Remote=10.65.223.239 diff --git a/test/fuzz/fuzz-netdev-parser/25-tap.netdev b/test/fuzz/fuzz-netdev-parser/25-tap.netdev new file mode 100644 index 00000000000..bf5e7fe52c1 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-tap.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=tap99 +Kind=tap + +[Tap] +MultiQueue=true +PacketInfo=true diff --git a/test/fuzz/fuzz-netdev-parser/25-tun.netdev b/test/fuzz/fuzz-netdev-parser/25-tun.netdev new file mode 100644 index 00000000000..380ab21552f --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-tun.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=tun99 +Kind=tun + +[Tun] +MultiQueue=true +PacketInfo=true diff --git a/test/fuzz/fuzz-netdev-parser/25-vcan.netdev b/test/fuzz/fuzz-netdev-parser/25-vcan.netdev new file mode 100644 index 00000000000..ff1979536ad --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-vcan.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=vcan99 +Kind=vcan diff --git a/test/fuzz/fuzz-netdev-parser/25-veth.netdev b/test/fuzz/fuzz-netdev-parser/25-veth.netdev new file mode 100644 index 00000000000..9ae4ad53b87 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-veth.netdev @@ -0,0 +1,8 @@ +[NetDev] +Name=veth99 +Kind=veth +MACAddress=12:34:56:78:9a:bc + +[Peer] +Name=veth-peer +MACAddress=12:34:56:78:9a:bd diff --git a/test/fuzz/fuzz-netdev-parser/25-vrf.netdev b/test/fuzz/fuzz-netdev-parser/25-vrf.netdev new file mode 100644 index 00000000000..bf949ec293a --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-vrf.netdev @@ -0,0 +1,6 @@ +[NetDev] +Name=vrf99 +Kind=vrf + +[VRF] +TableId=42 diff --git a/test/fuzz/fuzz-netdev-parser/25-vti-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-vti-tunnel.netdev new file mode 100644 index 00000000000..cec62597815 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-vti-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=vtitun99 +Kind=vti + +[Tunnel] +Local=10.65.223.238 +Remote=10.65.223.239 diff --git a/test/fuzz/fuzz-netdev-parser/25-vti6-tunnel.netdev b/test/fuzz/fuzz-netdev-parser/25-vti6-tunnel.netdev new file mode 100644 index 00000000000..d150c9ce86a --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-vti6-tunnel.netdev @@ -0,0 +1,7 @@ +[NetDev] +Name=vti6tun99 +Kind=vti6 + +[Tunnel] +Local=2a00:ffde:4567:edde::4987 +Remote=2001:473:fece:cafe::5179 diff --git a/test/fuzz/fuzz-netdev-parser/25-vxlan.netdev b/test/fuzz/fuzz-netdev-parser/25-vxlan.netdev new file mode 100644 index 00000000000..819a58356fa --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-vxlan.netdev @@ -0,0 +1,16 @@ +[NetDev] +Name=vxlan99 +Kind=vxlan + +[VXLAN] +Id=999 +L2MissNotification=true +L3MissNotification=true +RouteShortCircuit=true +UDPChecksum=true +UDP6ZeroChecksumTx=true +UDP6ZeroChecksumRx=true +RemoteChecksumTx=true +RemoteChecksumRx=true +GroupPolicyExtension=true +DestinationPort=5555 diff --git a/test/fuzz/fuzz-netdev-parser/25-wireguard.netdev b/test/fuzz/fuzz-netdev-parser/25-wireguard.netdev new file mode 100644 index 00000000000..e07d6851298 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/25-wireguard.netdev @@ -0,0 +1,12 @@ +[NetDev] +Name=wg99 +Kind=wireguard + +[WireGuard] +PrivateKey=EEGlnEPYJV//kbvvIqxKkQwOiS+UENyPncC4bF46ong= +ListenPort=51820 + +[WireGuardPeer] +PublicKey=RDf+LSpeEre7YEIKaxg+wbpsNV7du+ktR99uBEtIiCA= +AllowedIPs=fd31:bf08:57cb::/48,192.168.26.0/24 +Endpoint=wireguard.example.com:51820 diff --git a/test/fuzz/fuzz-netdev-parser/26-bridge.netdev b/test/fuzz/fuzz-netdev-parser/26-bridge.netdev new file mode 100644 index 00000000000..9b31e06b5b7 --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/26-bridge.netdev @@ -0,0 +1,3 @@ +[NetDev] +Name=bridge99 +Kind=bridge diff --git a/test/fuzz/fuzz-netdev-parser/github-10615 b/test/fuzz/fuzz-netdev-parser/github-10615 new file mode 100644 index 00000000000..1151ebfb47e --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/github-10615 @@ -0,0 +1,5 @@ +[NetDev] +Name=veth99 +Kind=veth +MACAddress=12:34:56:78:9a:bc +MACAddress=12:34:56:78:9a:bc