diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 6a2dd0d04c..d61e3472c1 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -312,7 +312,7 @@ the mechanism is present, the two parts must be separated with a colon type:prefix. The address generation mechanism may be either prefixstable or - eui64. If not specified, eui64 is assumed. When + static. If not specified, static is assumed. When set to prefixstable a method for generating IPv6 Interface Identifiers to be used with IPv6 Stateless Address Autocon figuration (SLAAC). See RFC 7217. When IPv6 address is set, diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index ae38a36975..4bdc26a38f 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -278,13 +278,13 @@ static int ndisc_router_generate_address(Link *link, unsigned prefixlen, uint32_ break; } } - } else if (j->address_generation_type == IPV6_TOKEN_ADDRESS_GENERATION_EUI64) { + } else if (j->address_generation_type == IPV6_TOKEN_ADDRESS_GENERATION_STATIC) { memcpy(((uint8_t *)&address->in_addr.in6) + 8, ((uint8_t *) &j->prefix) + 8, 8); prefix = true; break; } - /* eui64 or fallback if prefixstable do not match */ + /* fallback to eui64 if prefixstable or static do not match */ if (!prefix) { /* see RFC4291 section 2.5.1 */ address->in_addr.in6.s6_addr[8] = link->mac.ether_addr_octet[0]; @@ -992,14 +992,20 @@ int config_parse_address_generation_type( if (r < 0) return log_oom(); - if (streq(word, "eui64")) - token->address_generation_type = IPV6_TOKEN_ADDRESS_GENERATION_EUI64; + if (streq(word, "static")) + token->address_generation_type = IPV6_TOKEN_ADDRESS_GENERATION_STATIC; else if (streq(word, "prefixstable")) token->address_generation_type = IPV6_TOKEN_ADDRESS_GENERATION_PREFIXSTABLE; else { - token->address_generation_type = IPV6_TOKEN_ADDRESS_GENERATION_EUI64; + token->address_generation_type = IPV6_TOKEN_ADDRESS_GENERATION_STATIC; p = rvalue; - } + } + + if (isempty(p)) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "Invalid IPv6Token= , ignoring assignment: %s", rvalue); + return 0; + } r = in_addr_from_string(AF_INET6, p, &buffer); if (r < 0) { diff --git a/src/network/networkd-ndisc.h b/src/network/networkd-ndisc.h index 18d1a96476..02c2f8afda 100644 --- a/src/network/networkd-ndisc.h +++ b/src/network/networkd-ndisc.h @@ -9,7 +9,7 @@ typedef struct IPv6Token IPv6Token; typedef enum IPv6TokenAddressGeneration { IPV6_TOKEN_ADDRESS_GENERATION_NONE, - IPV6_TOKEN_ADDRESS_GENERATION_EUI64, + IPV6_TOKEN_ADDRESS_GENERATION_STATIC, IPV6_TOKEN_ADDRESS_GENERATION_PREFIXSTABLE, _IPV6_TOKEN_ADDRESS_GENERATION_MAX, _IPV6_TOKEN_ADDRESS_GENERATION_INVALID = -1, diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-20548 b/test/fuzz/fuzz-network-parser/oss-fuzz-20548 new file mode 100644 index 0000000000..82efed50e0 Binary files /dev/null and b/test/fuzz/fuzz-network-parser/oss-fuzz-20548 differ diff --git a/test/test-network/conf/ipv6-prefix-veth-token-eui64.network b/test/test-network/conf/ipv6-prefix-veth-token-static.network similarity index 100% rename from test/test-network/conf/ipv6-prefix-veth-token-eui64.network rename to test/test-network/conf/ipv6-prefix-veth-token-static.network diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index b62160bf59..027570027d 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2680,7 +2680,7 @@ class NetworkdRATests(unittest.TestCase, Utilities): '25-veth.netdev', 'ipv6-prefix.network', 'ipv6-prefix-veth.network', - 'ipv6-prefix-veth-token-eui64.network', + 'ipv6-prefix-veth-token-static.network', 'ipv6-prefix-veth-token-prefixstable.network'] def setUp(self): @@ -2706,8 +2706,8 @@ class NetworkdRATests(unittest.TestCase, Utilities): print(output) self.assertRegex(output, '2002:da8:1:0') - def test_ipv6_token_eui64(self): - copy_unit_to_networkd_unit_path('25-veth.netdev', 'ipv6-prefix.network', 'ipv6-prefix-veth-token-eui64.network') + def test_ipv6_token_static(self): + copy_unit_to_networkd_unit_path('25-veth.netdev', 'ipv6-prefix.network', 'ipv6-prefix-veth-token-static.network') start_networkd() self.wait_online(['veth99:routable', 'veth-peer:degraded'])