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.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2022-06-06 09:52:52 +02:00
parent dd6d433a4f
commit 61af181344
3 changed files with 26 additions and 6 deletions
+2 -5
View File
@@ -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;
+23
View File
@@ -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;
+1 -1
View File
@@ -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)));