From 61af1813446ced383490fac93e31d6ea3fd5d178 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 15:49:40 +0200 Subject: [PATCH] basic/in-addr-util: drop check for prefix length in formatting function The general rule should be to be strict when parsing data, but lenient when printing it. Or in other words, we should verify data in verification functions, but not when printing things. It doesn't make sense to refuse to print a value that we are using internally. We were tripping ourselves in some of the print functions: we want to report than an address was configured with too-long prefix, but the log line would use "n/a" if the prefix was too long. This is not useful. Most of the time, the removal of the check doesn't make any difference, because we verified the prefix length on input. --- src/basic/in-addr-util.c | 7 ++----- src/test/test-in-addr-prefix-util.c | 23 +++++++++++++++++++++++ src/test/test-in-addr-util.c | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index 39ae694f20..6bf017260b 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -460,15 +460,12 @@ int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned assert(ret); if (family == AF_INET) - l = INET_ADDRSTRLEN + 3; + l = INET_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned); else if (family == AF_INET6) - l = INET6_ADDRSTRLEN + 4; + l = INET6_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned); else return -EAFNOSUPPORT; - if (prefixlen > FAMILY_ADDRESS_SIZE(family) * 8) - return -EINVAL; - x = new(char, l); if (!x) return -ENOMEM; diff --git a/src/test/test-in-addr-prefix-util.c b/src/test/test-in-addr-prefix-util.c index 6503353465..d2991b9d3d 100644 --- a/src/test/test-in-addr-prefix-util.c +++ b/src/test/test-in-addr-prefix-util.c @@ -3,6 +3,29 @@ #include "in-addr-prefix-util.h" #include "tests.h" +static void test_in_addr_prefix_to_string_one(int f, const char *addr, unsigned prefixlen) { + union in_addr_union ua; + _cleanup_free_ char *r; + + assert_se(in_addr_from_string(f, addr, &ua) >= 0); + assert_se(in_addr_prefix_to_string(f, &ua, prefixlen, &r) >= 0); + printf("%s: %s/%u == %s\n", __func__, addr, prefixlen, r); + assert_se(startswith(r, addr)); +} + +TEST(in_addr_to_string_prefix) { + test_in_addr_prefix_to_string_one(AF_INET, "192.168.0.1", 0); + test_in_addr_prefix_to_string_one(AF_INET, "192.168.0.1", 1); + test_in_addr_prefix_to_string_one(AF_INET, "192.168.0.1", 31); + test_in_addr_prefix_to_string_one(AF_INET, "192.168.0.1", 32); + test_in_addr_prefix_to_string_one(AF_INET, "192.168.0.1", 256); + test_in_addr_prefix_to_string_one(AF_INET, "10.11.12.13", UINT_MAX); + test_in_addr_prefix_to_string_one(AF_INET6, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 0); + test_in_addr_prefix_to_string_one(AF_INET6, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", UINT_MAX); + test_in_addr_prefix_to_string_one(AF_INET6, "::1", 11); + test_in_addr_prefix_to_string_one(AF_INET6, "fe80::", 33); +} + static void test_config_parse_in_addr_prefixes_one(int family, const union in_addr_union *addr, uint8_t prefixlen, Set **prefixes) { _cleanup_free_ char *str = NULL; diff --git a/src/test/test-in-addr-util.c b/src/test/test-in-addr-util.c index c0808d51b9..296cd27434 100644 --- a/src/test/test-in-addr-util.c +++ b/src/test/test-in-addr-util.c @@ -351,7 +351,7 @@ static void test_in_addr_to_string_one(int f, const char *addr) { assert_se(in_addr_from_string(f, addr, &ua) >= 0); assert_se(in_addr_to_string(f, &ua, &r) >= 0); - printf("test_in_addr_to_string_one: %s == %s\n", addr, r); + printf("%s: %s == %s\n", __func__, addr, r); assert_se(streq(addr, r)); assert_se(streq(r, IN_ADDR_TO_STRING(f, &ua))); -- 2.25.1