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); 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; 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