From adea26ee62dc904032507625cdfa4ef69506896a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 12 Nov 2018 00:35:57 +0900 Subject: [PATCH 1/3] util: specify the maximum-size element when initialize union Fixes oss-fuzz#11344. --- src/basic/in-addr-util.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 2dafa3c084..2f64c31f96 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -65,7 +65,9 @@ static inline size_t FAMILY_ADDRESS_SIZE(int family) { return family == AF_INET6 ? 16 : 4; } -#define IN_ADDR_NULL ((union in_addr_union) {}) +/* Workaround for clang, explicitly specify the maximum-size element here. + * See also oss-fuzz#11344. */ +#define IN_ADDR_NULL ((union in_addr_union) { .in6 = {} }) void in_addr_data_hash_func(const void *p, struct siphash *state); int in_addr_data_compare_func(const void *a, const void *b); From c1b4a2b03a618d17f26927e3fd17cdc4e23f0357 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 12 Nov 2018 00:36:48 +0900 Subject: [PATCH 2/3] fuzz: add testcase of oss-fuzz#11344 --- test/fuzz/fuzz-netdev-parser/oss-fuzz-11344 | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 test/fuzz/fuzz-netdev-parser/oss-fuzz-11344 diff --git a/test/fuzz/fuzz-netdev-parser/oss-fuzz-11344 b/test/fuzz/fuzz-netdev-parser/oss-fuzz-11344 new file mode 100644 index 0000000000..e3744c608c --- /dev/null +++ b/test/fuzz/fuzz-netdev-parser/oss-fuzz-11344 @@ -0,0 +1,6 @@ +[NetDev] +Name=v +Kind=vti +[Tunnel] +Local=:: +Local=any \ No newline at end of file From 3c7911e810095d4b4f609727f4335e5e9ca48a47 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 12 Nov 2018 00:48:30 +0900 Subject: [PATCH 3/3] network: use IN_ADDR_NULL --- src/network/networkd-route.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index e8cde66bef..21b5de3f26 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -364,10 +364,10 @@ void route_update(Route *route, assert(route); assert(src || src_prefixlen == 0); - route->src = src ? *src : (union in_addr_union) {}; + route->src = src ? *src : IN_ADDR_NULL; route->src_prefixlen = src_prefixlen; - route->gw = gw ? *gw : (union in_addr_union) {}; - route->prefsrc = prefsrc ? *prefsrc : (union in_addr_union) {}; + route->gw = gw ? *gw : IN_ADDR_NULL; + route->prefsrc = prefsrc ? *prefsrc : IN_ADDR_NULL; route->scope = scope; route->protocol = protocol; route->type = type;