From a0460dfed617a73f7dbf36a6eb7e474e887ae780 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 23 Nov 2023 05:03:43 +0900 Subject: [PATCH] parse-util: accept arbitrary MTU size when AF_UNSPEC When [Link] MTU= is specified in a .network file, we have no idea about that what kind of interface will be configured with the .network file. The maximum and minimum MTU size depend on the kind of interface. So, we should not filter MTU eagerly in the parser. Closes #30140. --- src/basic/parse-util.c | 15 +++++++++----- src/test/test-parse-util.c | 25 ++++++++++++++++++----- test/test-network-generator-conversion.sh | 2 +- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index dc868c9b8e..0430e33e40 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -123,8 +123,7 @@ int parse_ifindex(const char *s) { } int parse_mtu(int family, const char *s, uint32_t *ret) { - uint64_t u; - size_t m; + uint64_t u, m; int r; r = parse_size(s, 1024, &u); @@ -134,10 +133,16 @@ int parse_mtu(int family, const char *s, uint32_t *ret) { if (u > UINT32_MAX) return -ERANGE; - if (family == AF_INET6) + switch (family) { + case AF_INET: + m = IPV4_MIN_MTU; /* This is 68 */ + break; + case AF_INET6: m = IPV6_MIN_MTU; /* This is 1280 */ - else - m = IPV4_MIN_MTU; /* For all other protocols, including 'unspecified' we assume the IPv4 minimal MTU */ + break; + default: + m = 0; + } if (u < m) return -ERANGE; diff --git a/src/test/test-parse-util.c b/src/test/test-parse-util.c index 7a485f390f..58d22b6cfe 100644 --- a/src/test/test-parse-util.c +++ b/src/test/test-parse-util.c @@ -914,15 +914,30 @@ TEST(parse_mtu) { assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295); assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500); assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280); + assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE); + assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68); + assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) >= 0 && mtu == 67); + assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) >= 0 && mtu == 0); + assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL); + + assert_se(parse_mtu(AF_INET, "1500", &mtu) >= 0 && mtu == 1500); + assert_se(parse_mtu(AF_INET, "1400", &mtu) >= 0 && mtu == 1400); + assert_se(parse_mtu(AF_INET, "65535", &mtu) >= 0 && mtu == 65535); + assert_se(parse_mtu(AF_INET, "65536", &mtu) >= 0 && mtu == 65536); + assert_se(parse_mtu(AF_INET, "4294967295", &mtu) >= 0 && mtu == 4294967295); + assert_se(parse_mtu(AF_INET, "500", &mtu) >= 0 && mtu == 500); + assert_se(parse_mtu(AF_INET, "1280", &mtu) >= 0 && mtu == 1280); + assert_se(parse_mtu(AF_INET, "4294967296", &mtu) == -ERANGE); + assert_se(parse_mtu(AF_INET, "68", &mtu) >= 0 && mtu == 68); + assert_se(parse_mtu(AF_INET, "67", &mtu) == -ERANGE); + assert_se(parse_mtu(AF_INET, "0", &mtu) == -ERANGE); + assert_se(parse_mtu(AF_INET, "", &mtu) == -EINVAL); + assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280); assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE); - assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE); assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE); assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE); - assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68); - assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE); - assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE); - assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL); + assert_se(parse_mtu(AF_INET6, "", &mtu) == -EINVAL); } TEST(parse_loadavg_fixed_point) { diff --git a/test/test-network-generator-conversion.sh b/test/test-network-generator-conversion.sh index 6224a4d04f..9a4732c981 100755 --- a/test/test-network-generator-conversion.sh +++ b/test/test-network-generator-conversion.sh @@ -296,7 +296,7 @@ INVALID_COMMAND_LINES=( "ip=10.0.0.1:::255.255.255::foo99:off" "ip=10.0.0.1:::255.255.255.0:invalid_hostname:foo99:off" "ip=10.0.0.1:::255.255.255.0::verylonginterfacename:off" - "ip=:::::dhcp99:dhcp6:0" + "ip=:::::dhcp99:dhcp6:4294967296" "ip=:::::dhcp99:dhcp6:-1" "ip=:::::dhcp99:dhcp6:666:52:54:00" "ip=fdef:c400:bd01:1096::2::[fdef:c400:bd01:1096::1]:64::ipv6:off:[fdef:c400:bd01:1096::aaaa]" -- 2.25.1