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)));