From 6f639b25554658d8f1021ab6ea8724f8078ccc28 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 13 Oct 2024 15:08:04 +0900 Subject: [PATCH 1/2] network/address: do not set family in config_parse_broadcast() The family will be checked later in address_section_verify() -> address_section_adjust_broadcast(), hence it is not necessary to set here. Follow-up for 5d15c7b19cae6d3332d4e213c380e0fcc1317a2c. Fixes oss-fuzz#372994449. Fixes #34748. --- src/network/networkd-address.c | 9 +++++---- test/fuzz/fuzz-network-parser/oss-fuzz-372994449 | Bin 0 -> 4740 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 test/fuzz/fuzz-network-parser/oss-fuzz-372994449 diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index deffa4dead..228cb93fc8 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -2033,9 +2033,12 @@ static int config_parse_broadcast( union in_addr_union u; int r; + /* Do not check or set address->family here. It will be checked later in + * address_section_verify() -> address_section_adjust_broadcast() . */ + if (isempty(rvalue)) { /* The broadcast address will be calculated based on Address=, and set if the link is - * not a wireguard interface. Here, we do not check or set address->family. */ + * not a wireguard interface. */ address->broadcast = (struct in_addr) {}; address->set_broadcast = -1; return 1; @@ -2043,8 +2046,7 @@ static int config_parse_broadcast( r = parse_boolean(rvalue); if (r >= 0) { - /* The broadcast address will be calculated based on Address=. Here, we do not check or - * set address->family. */ + /* The broadcast address will be calculated based on Address=. */ address->broadcast = (struct in_addr) {}; address->set_broadcast = r; return 1; @@ -2061,7 +2063,6 @@ static int config_parse_broadcast( address->broadcast = u.in; address->set_broadcast = true; - address->family = AF_INET; return 1; } diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-372994449 b/test/fuzz/fuzz-network-parser/oss-fuzz-372994449 new file mode 100644 index 0000000000000000000000000000000000000000..76c3a4903cb7ea82271ce46b32391c4236a22cb6 GIT binary patch literal 4740 zcmeHK!H&}~5H(kyIPe1;IINJ|#7?uNk`G-10t8jG%Ps05B$l?KOH1Oev=@Gi1E0h% zU^`A4Hz`T8A?<4-T)9>2cJS7-7aAMI}h&|T||7j{zjLZdlv??I8Ioa zE}#$JCtu&(ZTH{$ka0GhTF~2WR?8^lOmFeT`$LgpAL><9Y;_v;g8XFv*eU z21z7NUrCZgKqieUh6s>aRYsUJTQQ1>g-Hfwo$!SuWWnH!omkSX!p@G{Xz9F)Rrz^) z(*<%eT^L@3R5q1FX4RKc)|61KsVz2y=c&xNg)$d#uHd!|z##}D(D=Ad(GPoIoK6e1 zU&=mutV(FUre@EU-UIkhUsAO5aYt2oA$z`*ha&-9)utny!w6M%GPeMQb2wm<&Y~mq z-K7hwb7^rHM3ZmbCT7wl?EuO}RlnJC|&Bcb9Wv Date: Sun, 13 Oct 2024 15:17:07 +0900 Subject: [PATCH 2/2] network/address: use config_parse_in_addr_non_null() at one more place No functional change, just refactoring. --- src/network/networkd-address.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 228cb93fc8..0e06149f33 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -2030,7 +2030,6 @@ static int config_parse_broadcast( void *userdata) { Address *address = ASSERT_PTR(userdata); - union in_addr_union u; int r; /* Do not check or set address->family here. It will be checked later in @@ -2052,16 +2051,13 @@ static int config_parse_broadcast( return 1; } - r = in_addr_from_string(AF_INET, rvalue, &u); - if (r < 0) - return log_syntax_parse_error(unit, filename, line, r, lvalue, rvalue); - if (in4_addr_is_null(&u.in)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "Broadcast cannot be ANY address, ignoring assignment: %s", rvalue); - return 0; - } + r = config_parse_in_addr_non_null( + unit, filename, line, section, section_line, + lvalue, /* ltype = */ AF_INET, rvalue, + &address->broadcast, /* userdata = */ NULL); + if (r <= 0) + return r; - address->broadcast = u.in; address->set_broadcast = true; return 1; }