From 84dbb3fd83ef7d7e5b2ea02be1f492974384256c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 11:24:02 +0200 Subject: [PATCH 1/9] basic/in-addr-util: add IN_ADDR_TO_STRING Since we don't need the error value, and the buffer is allocated with a fixed size, the whole logic provided by in_addr_to_string() becomes unnecessary, so it's enough to wrap inet_ntop() directly. inet_ntop() can only fail with ENOSPC. But we specify a buffer that is supposed to be large enough, so this should never fail. A bunch of tests of this are added. This allows all the wrappers like strna(), strnull(), strempty() to be dropped. The guard of 'if (DEBUG_LOGGING)' can be dropped from around log_debug(), because log_debug() implements the check outside of the function call. But log_link_debug() does not, so it we need it to avoid unnecessary evaluation of the formatting. --- src/basic/in-addr-util.c | 2 +- src/basic/in-addr-util.h | 21 ++++++++++++++++++ src/libsystemd-network/sd-dhcp6-client.c | 9 +++----- src/libsystemd-network/sd-ipv4ll.c | 4 +--- src/libsystemd-network/sd-ndisc.c | 5 ++--- src/libsystemd-network/sd-radv.c | 11 +++++----- src/libsystemd-network/test-ipv4ll-manual.c | 13 +++++------ src/network/netdev/l2tp-tunnel.c | 9 +++----- src/network/networkd-address.c | 11 +++++----- src/network/networkd-bridge-mdb.c | 8 ++----- src/network/networkd-dhcp6.c | 19 ++++++---------- src/network/networkd-ipv6ll.c | 8 ++----- src/network/networkd-ndisc.c | 24 ++++++--------------- src/network/networkd-neighbor.c | 6 +++--- src/network/networkd-nexthop.c | 7 +++--- src/nspawn/nspawn-expose-ports.c | 7 +----- src/resolve/resolved-bus.c | 6 ++---- src/resolve/resolved-dns-cache.c | 24 ++++++++------------- src/resolve/resolved-dns-transaction.c | 5 +---- src/resolve/resolved-manager.c | 14 ++++-------- src/resolve/test-resolved-stream.c | 10 ++++----- src/test/test-in-addr-util.c | 4 +++- src/test/test-utmp.c | 5 +---- 23 files changed, 98 insertions(+), 134 deletions(-) diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index 660c1f1824..39ae694f20 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -444,7 +444,7 @@ int in_addr_to_string(int family, const union in_addr_union *u, char **ret) { return -ENOMEM; errno = 0; - if (!inet_ntop(family, u, x, l)) + if (!typesafe_inet_ntop(family, u, x, l)) return errno_or_else(EINVAL); *ret = TAKE_PTR(x); diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 5de87a9539..89d0505c13 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include #include #include #include @@ -68,10 +69,30 @@ int in_addr_prefix_range( unsigned prefixlen, union in_addr_union *ret_start, union in_addr_union *ret_end); + int in_addr_to_string(int family, const union in_addr_union *u, char **ret); static inline int in6_addr_to_string(const struct in6_addr *u, char **ret) { return in_addr_to_string(AF_INET6, (const union in_addr_union*) u, ret); } + +static inline const char* typesafe_inet_ntop(int family, const union in_addr_union *a, char *buf, size_t len) { + return inet_ntop(family, a, buf, len); +} +static inline const char* typesafe_inet_ntop4(const struct in_addr *a, char *buf, size_t len) { + return inet_ntop(AF_INET, a, buf, len); +} +static inline const char* typesafe_inet_ntop6(const struct in6_addr *a, char *buf, size_t len) { + return inet_ntop(AF_INET6, a, buf, len); +} + +/* Note: the lifetime of the compound literal is the immediately surrounding block, + * see C11 §6.5.2.5, and + * https://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks */ +#define IN_ADDR_MAX CONST_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) +#define IN_ADDR_TO_STRING(family, addr) typesafe_inet_ntop(family, addr, (char[IN_ADDR_MAX]){}, IN_ADDR_MAX) +#define IN4_ADDR_TO_STRING(addr) typesafe_inet_ntop4(addr, (char[INET_ADDRSTRLEN]){}, INET_ADDRSTRLEN) +#define IN6_ADDR_TO_STRING(addr) typesafe_inet_ntop6(addr, (char[INET6_ADDRSTRLEN]){}, INET6_ADDRSTRLEN) + int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret); static inline int in6_addr_prefix_to_string(const struct in6_addr *u, unsigned prefixlen, char **ret) { return in_addr_prefix_to_string(AF_INET6, (const union in_addr_union*) u, prefixlen, ret); diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index b346a50d78..4ca5159106 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -1344,13 +1344,10 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client) { if (client->fd < 0) { r = dhcp6_network_bind_udp_socket(client->ifindex, &client->local_address); - if (r < 0) { - _cleanup_free_ char *p = NULL; - - (void) in6_addr_to_string(&client->local_address, &p); + if (r < 0) return log_dhcp6_client_errno(client, r, - "Failed to bind to UDP socket at address %s: %m", strna(p)); - } + "Failed to bind to UDP socket at address %s: %m", + IN6_ADDR_TO_STRING(&client->local_address)); client->fd = r; } diff --git a/src/libsystemd-network/sd-ipv4ll.c b/src/libsystemd-network/sd-ipv4ll.c index ff065fd1b6..fe0d836165 100644 --- a/src/libsystemd-network/sd-ipv4ll.c +++ b/src/libsystemd-network/sd-ipv4ll.c @@ -240,7 +240,6 @@ int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address) { #define PICK_HASH_KEY SD_ID128_MAKE(15,ac,82,a6,d6,3f,49,78,98,77,5d,0c,69,02,94,0b) static int ipv4ll_pick_address(sd_ipv4ll *ll) { - _cleanup_free_ char *address = NULL; be32_t addr; assert(ll); @@ -257,8 +256,7 @@ static int ipv4ll_pick_address(sd_ipv4ll *ll) { } while (addr == ll->address || IN_SET(be32toh(addr) & 0x0000FF00U, 0x0000U, 0xFF00U)); - (void) in_addr_to_string(AF_INET, &(union in_addr_union) { .in.s_addr = addr }, &address); - log_ipv4ll(ll, "Picked new IP address %s.", strna(address)); + log_ipv4ll(ll, "Picked new IP address %s.", IN4_ADDR_TO_STRING((const struct in_addr*) &addr)); return sd_ipv4ll_set_address(ll, &(struct in_addr) { addr }); } diff --git a/src/libsystemd-network/sd-ndisc.c b/src/libsystemd-network/sd-ndisc.c index ecd552ca0c..f7522aa8d6 100644 --- a/src/libsystemd-network/sd-ndisc.c +++ b/src/libsystemd-network/sd-ndisc.c @@ -203,7 +203,6 @@ static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userda sd_ndisc *nd = userdata; ssize_t buflen; int r; - _cleanup_free_ char *addr = NULL; assert(s); assert(nd); @@ -229,8 +228,8 @@ static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userda switch (r) { case -EADDRNOTAVAIL: - (void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &rt->address, &addr); - log_ndisc(nd, "Received RA from non-link-local address %s. Ignoring", addr); + log_ndisc(nd, "Received RA from non-link-local address %s. Ignoring.", + IN6_ADDR_TO_STRING(&rt->address)); break; case -EMULTIHOP: diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 7b5c12e489..47339cf239 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -244,7 +244,6 @@ static int radv_send(sd_radv *ra, const struct in6_addr *dst, usec_t lifetime_us static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) { sd_radv *ra = userdata; - _cleanup_free_ char *addr = NULL; struct in6_addr src; triple_timestamp timestamp; int r; @@ -275,8 +274,8 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat switch (r) { case -EADDRNOTAVAIL: - (void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &src, &addr); - log_radv(ra, "Received RS from non-link-local address %s. Ignoring", addr); + log_radv(ra, "Received RS from non-link-local address %s. Ignoring", + IN6_ADDR_TO_STRING(&src)); break; case -EMULTIHOP: @@ -300,13 +299,13 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat return 0; } - (void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &src, &addr); + const char *addr = IN6_ADDR_TO_STRING(&src); r = radv_send(ra, &src, ra->lifetime_usec); if (r < 0) - log_radv_errno(ra, r, "Unable to send solicited Router Advertisement to %s, ignoring: %m", strnull(addr)); + log_radv_errno(ra, r, "Unable to send solicited Router Advertisement to %s, ignoring: %m", addr); else - log_radv(ra, "Sent solicited Router Advertisement to %s", strnull(addr)); + log_radv(ra, "Sent solicited Router Advertisement to %s", addr); return 0; } diff --git a/src/libsystemd-network/test-ipv4ll-manual.c b/src/libsystemd-network/test-ipv4ll-manual.c index 3fea894f30..e79758c5f5 100644 --- a/src/libsystemd-network/test-ipv4ll-manual.c +++ b/src/libsystemd-network/test-ipv4ll-manual.c @@ -19,23 +19,20 @@ #include "util.h" static void ll_handler(sd_ipv4ll *ll, int event, void *userdata) { - _cleanup_free_ char *address = NULL; - struct in_addr addr = {}; - assert_se(ll); - if (sd_ipv4ll_get_address(ll, &addr) >= 0) - assert_se(in_addr_to_string(AF_INET, (const union in_addr_union*) &addr, &address) >= 0); + struct in_addr addr; + const char *pretty = sd_ipv4ll_get_address(ll, &addr) >= 0 ? IN4_ADDR_TO_STRING(&addr) : NULL; switch (event) { case SD_IPV4LL_EVENT_BIND: - log_info("bound %s", strna(address)); + log_info("bound %s", strna(pretty)); break; case SD_IPV4LL_EVENT_CONFLICT: - log_info("conflict on %s", strna(address)); + log_info("conflict on %s", strna(pretty)); break; case SD_IPV4LL_EVENT_STOP: - log_error("the client was stopped with address %s", strna(address)); + log_error("the client was stopped with address %s", strna(pretty)); break; default: assert_not_reached(); diff --git a/src/network/netdev/l2tp-tunnel.c b/src/network/netdev/l2tp-tunnel.c index 05af5dbf89..dcb70bfef2 100644 --- a/src/network/netdev/l2tp-tunnel.c +++ b/src/network/netdev/l2tp-tunnel.c @@ -445,12 +445,9 @@ static int l2tp_create_tunnel(NetDev *netdev) { if (r < 0) return log_netdev_error_errno(netdev, r, "Could not find local address."); - if (t->local_address_type >= 0 && DEBUG_LOGGING) { - _cleanup_free_ char *str = NULL; - - (void) in_addr_to_string(t->family, &local_address, &str); - log_netdev_debug(netdev, "Local address %s acquired.", strna(str)); - } + if (t->local_address_type >= 0 && DEBUG_LOGGING) + log_netdev_debug(netdev, "Local address %s acquired.", + IN_ADDR_TO_STRING(t->family, &local_address)); r = netdev_l2tp_create_message_tunnel(netdev, &local_address, &m); if (r < 0) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index afcd53cbc7..5e37dc9907 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -648,7 +648,7 @@ const char* format_lifetime(char *buf, size_t l, usec_t lifetime_usec) { } static void log_address_debug(const Address *address, const char *str, const Link *link) { - _cleanup_free_ char *state = NULL, *addr = NULL, *peer = NULL, *flags_str = NULL, *scope_str = NULL; + _cleanup_free_ char *state = NULL, *flags_str = NULL, *scope_str = NULL; assert(address); assert(str); @@ -658,16 +658,17 @@ static void log_address_debug(const Address *address, const char *str, const Lin return; (void) network_config_state_to_string_alloc(address->state, &state); - (void) in_addr_to_string(address->family, &address->in_addr, &addr); - if (in_addr_is_set(address->family, &address->in_addr_peer)) - (void) in_addr_to_string(address->family, &address->in_addr_peer, &peer); + + const char *peer = in_addr_is_set(address->family, &address->in_addr_peer) ? + IN_ADDR_TO_STRING(address->family, &address->in_addr_peer) : NULL; (void) address_flags_to_string_alloc(address->flags, address->family, &flags_str); (void) route_scope_to_string_alloc(address->scope, &scope_str); log_link_debug(link, "%s %s address (%s): %s%s%s/%u (valid %s, preferred %s), flags: %s, scope: %s", str, strna(network_config_source_to_string(address->source)), strna(state), - strnull(addr), peer ? " peer " : "", strempty(peer), address->prefixlen, + IN_ADDR_TO_STRING(address->family, &address->in_addr), + peer ? " peer " : "", strempty(peer), address->prefixlen, FORMAT_LIFETIME(address->lifetime_valid_usec), FORMAT_LIFETIME(address->lifetime_preferred_usec), strna(flags_str), strna(scope_str)); diff --git a/src/network/networkd-bridge-mdb.c b/src/network/networkd-bridge-mdb.c index 3af4afe4a1..bd1a9745dc 100644 --- a/src/network/networkd-bridge-mdb.c +++ b/src/network/networkd-bridge-mdb.c @@ -119,13 +119,9 @@ static int bridge_mdb_configure(BridgeMDB *mdb, Link *link, Request *req) { assert(link->manager); assert(req); - if (DEBUG_LOGGING) { - _cleanup_free_ char *a = NULL; - - (void) in_addr_to_string(mdb->family, &mdb->group_addr, &a); + if (DEBUG_LOGGING) log_link_debug(link, "Configuring bridge MDB entry: MulticastGroupAddress=%s, VLANId=%u", - strna(a), mdb->vlan_id); - } + IN_ADDR_TO_STRING(mdb->family, &mdb->group_addr), mdb->vlan_id); entry = (struct br_mdb_entry) { /* If MDB entry is added on bridge master, then the state must be MDB_TEMPORARY. diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 5786eca803..3dc34f0e52 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -153,7 +153,6 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques } static int verify_dhcp6_address(Link *link, const Address *address) { - _cleanup_free_ char *buffer = NULL; bool by_ndisc = false; Address *existing; int log_level; @@ -162,7 +161,7 @@ static int verify_dhcp6_address(Link *link, const Address *address) { assert(address); assert(address->family == AF_INET6); - (void) in6_addr_to_string(&address->in_addr.in6, &buffer); + const char *pretty = IN6_ADDR_TO_STRING(&address->in_addr.in6); if (address_get(link, address, &existing) < 0 && link_get_address(link, AF_INET6, &address->in_addr, 0, &existing) < 0) { @@ -180,10 +179,10 @@ static int verify_dhcp6_address(Link *link, const Address *address) { by_ndisc = true; log_link_warning(link, "Ignoring DHCPv6 address %s/%u (valid %s, preferred %s) which conflicts with %s/%u%s.", - strna(buffer), address->prefixlen, + pretty, address->prefixlen, FORMAT_LIFETIME(address->lifetime_valid_usec), FORMAT_LIFETIME(address->lifetime_preferred_usec), - strna(buffer), existing->prefixlen, + pretty, existing->prefixlen, by_ndisc ? " assigned by NDisc" : ""); if (by_ndisc) log_link_warning(link, "Hint: use IPv6Token= setting to change the address generated by NDisc or set UseAutonomousPrefix=no."); @@ -192,7 +191,7 @@ static int verify_dhcp6_address(Link *link, const Address *address) { simple_log: log_link_full(link, log_level, "DHCPv6 address %s/%u (valid %s, preferred %s)", - strna(buffer), address->prefixlen, + pretty, address->prefixlen, FORMAT_LIFETIME(address->lifetime_valid_usec), FORMAT_LIFETIME(address->lifetime_preferred_usec)); return 0; @@ -232,13 +231,9 @@ static int dhcp6_request_address( r = link_request_address(link, TAKE_PTR(addr), true, &link->dhcp6_messages, dhcp6_address_handler, NULL); - if (r < 0) { - _cleanup_free_ char *buffer = NULL; - - (void) in6_addr_to_string(ip6_addr, &buffer); - return log_link_error_errno(link, r, "Failed to request DHCPv6 address %s/128: %m", strna(buffer)); - } - + if (r < 0) + return log_link_error_errno(link, r, "Failed to request DHCPv6 address %s/128: %m", + IN6_ADDR_TO_STRING(ip6_addr)); return 0; } diff --git a/src/network/networkd-ipv6ll.c b/src/network/networkd-ipv6ll.c index dc09171afe..9b85989701 100644 --- a/src/network/networkd-ipv6ll.c +++ b/src/network/networkd-ipv6ll.c @@ -182,7 +182,6 @@ int link_update_ipv6ll_addrgen_mode(Link *link, sd_netlink_message *message) { #define STABLE_SECRET_APP_ID_2 SD_ID128_MAKE(52,c4,40,a0,9f,2f,48,58,a9,3a,f6,29,25,ba,7a,7d) int link_set_ipv6ll_stable_secret(Link *link) { - _cleanup_free_ char *str = NULL; struct in6_addr a; int r; @@ -216,11 +215,8 @@ int link_set_ipv6ll_stable_secret(Link *link) { memcpy(a.s6_addr + sizeof(v), &v, sizeof(v)); } - r = in6_addr_to_string(&a, &str); - if (r < 0) - return r; - - return sysctl_write_ip_property(AF_INET6, link->ifname, "stable_secret", str); + return sysctl_write_ip_property(AF_INET6, link->ifname, "stable_secret", + IN6_ADDR_TO_STRING(&a)); } int link_set_ipv6ll_addrgen_mode(Link *link, IPv6LinkLocalAddressGenMode mode) { diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index efe407fedb..66127f36c9 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -327,13 +327,9 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) { return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m"); if (link_get_ipv6_address(link, &gateway, 0, NULL) >= 0) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *buffer = NULL; - - (void) in6_addr_to_string(&gateway, &buffer); + if (DEBUG_LOGGING) log_link_debug(link, "No NDisc route added, gateway %s matches local address", - strna(buffer)); - } + IN6_ADDR_TO_STRING(&gateway)); return 0; } @@ -639,12 +635,9 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) { return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m"); if (link_get_ipv6_address(link, &gateway, 0, NULL) >= 0) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_to_string(&gateway, &buf); - log_link_debug(link, "Advertised route gateway %s is local to the link, ignoring route", strna(buf)); - } + if (DEBUG_LOGGING) + log_link_debug(link, "Advertised route gateway %s is local to the link, ignoring route", + IN6_ADDR_TO_STRING(&gateway)); return 0; } @@ -986,13 +979,10 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) { if (in6_prefix_is_filtered(&router, 128, link->network->ndisc_allow_listed_router, link->network->ndisc_deny_listed_router)) { if (DEBUG_LOGGING) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_to_string(&router, &buf); if (!set_isempty(link->network->ndisc_allow_listed_router)) - log_link_debug(link, "Router '%s' is not in allow list, ignoring", strna(buf)); + log_link_debug(link, "Router %s is not in allow list, ignoring.", IN6_ADDR_TO_STRING(&router)); else - log_link_debug(link, "Router '%s' is in deny list, ignoring", strna(buf)); + log_link_debug(link, "Router %s is in deny list, ignoring.", IN6_ADDR_TO_STRING(&router)); } return 0; } diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index 435fa7002e..f11f06001b 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -158,7 +158,7 @@ static int neighbor_add(Link *link, Neighbor *neighbor) { } static void log_neighbor_debug(const Neighbor *neighbor, const char *str, const Link *link) { - _cleanup_free_ char *state = NULL, *dst = NULL; + _cleanup_free_ char *state = NULL; assert(neighbor); assert(str); @@ -167,12 +167,12 @@ static void log_neighbor_debug(const Neighbor *neighbor, const char *str, const return; (void) network_config_state_to_string_alloc(neighbor->state, &state); - (void) in_addr_to_string(neighbor->family, &neighbor->in_addr, &dst); log_link_debug(link, "%s %s neighbor (%s): lladdr: %s, dst: %s", str, strna(network_config_source_to_string(neighbor->source)), strna(state), - HW_ADDR_TO_STR(&neighbor->ll_addr), strna(dst)); + HW_ADDR_TO_STR(&neighbor->ll_addr), + IN_ADDR_TO_STRING(neighbor->family, &neighbor->in_addr)); } static int neighbor_configure_message(Neighbor *neighbor, Link *link, sd_netlink_message *req) { diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 3eb9d62f7c..a3b50cefe1 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -346,7 +346,7 @@ static int nexthop_acquire_id(Manager *manager, NextHop *nexthop) { } static void log_nexthop_debug(const NextHop *nexthop, const char *str, const Link *link) { - _cleanup_free_ char *state = NULL, *gw = NULL, *group = NULL, *flags = NULL; + _cleanup_free_ char *state = NULL, *group = NULL, *flags = NULL; struct nexthop_grp *nhg; assert(nexthop); @@ -358,7 +358,6 @@ static void log_nexthop_debug(const NextHop *nexthop, const char *str, const Lin return; (void) network_config_state_to_string_alloc(nexthop->state, &state); - (void) in_addr_to_string(nexthop->family, &nexthop->gw, &gw); (void) route_flags_to_string_alloc(nexthop->flags, &flags); HASHMAP_FOREACH(nhg, nexthop->group) @@ -366,7 +365,9 @@ static void log_nexthop_debug(const NextHop *nexthop, const char *str, const Lin log_link_debug(link, "%s %s nexthop (%s): id: %"PRIu32", gw: %s, blackhole: %s, group: %s, flags: %s", str, strna(network_config_source_to_string(nexthop->source)), strna(state), - nexthop->id, strna(gw), yes_no(nexthop->blackhole), strna(group), strna(flags)); + nexthop->id, + IN_ADDR_TO_STRING(nexthop->family, &nexthop->gw), + yes_no(nexthop->blackhole), strna(group), strna(flags)); } static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { diff --git a/src/nspawn/nspawn-expose-ports.c b/src/nspawn/nspawn-expose-ports.c index 166383cce3..bb54f8c1e7 100644 --- a/src/nspawn/nspawn-expose-ports.c +++ b/src/nspawn/nspawn-expose-ports.c @@ -141,14 +141,9 @@ int expose_port_execute(sd_netlink *rtnl, FirewallContext **fw_ctx, ExposePort * if (in_addr_equal(af, exposed, &new_exposed)) return 0; - if (DEBUG_LOGGING) { - _cleanup_free_ char *pretty = NULL; - in_addr_to_string(af, &new_exposed, &pretty); - log_debug("New container IP is %s.", strna(pretty)); - } + log_debug("New container IP is %s.", IN_ADDR_TO_STRING(af, &new_exposed)); LIST_FOREACH(ports, p, l) { - r = fw_add_local_dnat(fw_ctx, true, af, diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 8207a04196..e19d3de8ea 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -596,11 +596,9 @@ static void bus_method_resolve_address_complete(DnsQuery *query) { } if (added <= 0) { - _cleanup_free_ char *ip = NULL; - - (void) in_addr_to_string(q->request_family, &q->request_address, &ip); r = reply_method_errorf(q, BUS_ERROR_NO_SUCH_RR, - "Address '%s' does not have any RR of requested type", strnull(ip)); + "Address %s does not have any RR of requested type", + IN_ADDR_TO_STRING(q->request_family, &q->request_address)); goto finish; } diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index e7ab4e5569..3f107603bf 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -493,21 +493,15 @@ static int dns_cache_put_positive( if (r < 0) return r; - if (DEBUG_LOGGING) { - _cleanup_free_ char *t = NULL; - - (void) in_addr_to_string(i->owner_family, &i->owner_address, &t); - - log_debug("Added positive %s %s%s cache entry for %s "USEC_FMT"s on %s/%s/%s", - FLAGS_SET(i->query_flags, SD_RESOLVED_AUTHENTICATED) ? "authenticated" : "unauthenticated", - FLAGS_SET(i->query_flags, SD_RESOLVED_CONFIDENTIAL) ? "confidential" : "non-confidential", - i->shared_owner ? " shared" : "", - dns_resource_key_to_string(i->key, key_str, sizeof key_str), - (i->until - timestamp) / USEC_PER_SEC, - i->ifindex == 0 ? "*" : FORMAT_IFNAME(i->ifindex), - af_to_name_short(i->owner_family), - strna(t)); - } + log_debug("Added positive %s %s%s cache entry for %s "USEC_FMT"s on %s/%s/%s", + FLAGS_SET(i->query_flags, SD_RESOLVED_AUTHENTICATED) ? "authenticated" : "unauthenticated", + FLAGS_SET(i->query_flags, SD_RESOLVED_CONFIDENTIAL) ? "confidential" : "non-confidential", + i->shared_owner ? " shared" : "", + dns_resource_key_to_string(i->key, key_str, sizeof key_str), + (i->until - timestamp) / USEC_PER_SEC, + i->ifindex == 0 ? "*" : FORMAT_IFNAME(i->ifindex), + af_to_name_short(i->owner_family), + IN_ADDR_TO_STRING(i->owner_family, &i->owner_address)); i = NULL; return 0; diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c index 158e5b44b0..ba76725655 100644 --- a/src/resolve/resolved-dns-transaction.c +++ b/src/resolve/resolved-dns-transaction.c @@ -333,7 +333,6 @@ static void dns_transaction_shuffle_id(DnsTransaction *t) { } static void dns_transaction_tentative(DnsTransaction *t, DnsPacket *p) { - _cleanup_free_ char *pretty = NULL; char key_str[DNS_RESOURCE_KEY_STRING_MAX]; DnsZoneItem *z; @@ -344,15 +343,13 @@ static void dns_transaction_tentative(DnsTransaction *t, DnsPacket *p) { if (manager_packet_from_local_address(t->scope->manager, p) != 0) return; - (void) in_addr_to_string(p->family, &p->sender, &pretty); - log_debug("Transaction %" PRIu16 " for <%s> on scope %s on %s/%s got tentative packet from %s.", t->id, dns_resource_key_to_string(dns_transaction_key(t), key_str, sizeof key_str), dns_protocol_to_string(t->scope->protocol), t->scope->link ? t->scope->link->ifname : "*", af_to_name_short(t->scope->family), - strnull(pretty)); + IN_ADDR_TO_STRING(p->family, &p->sender)); /* RFC 4795, Section 4.1 says that the peer with the * lexicographically smaller IP address loses */ diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 12e7d87f22..d2eaea584b 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -870,16 +870,10 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) { p->ifindex = manager_find_ifindex(m, p->family, &p->destination); } - if (DEBUG_LOGGING) { - _cleanup_free_ char *sender_address = NULL, *destination_address = NULL; - - (void) in_addr_to_string(p->family, &p->sender, &sender_address); - (void) in_addr_to_string(p->family, &p->destination, &destination_address); - - log_debug("Received %s UDP packet of size %zu, ifindex=%i, ttl=%i, fragsize=%zu, sender=%s, destination=%s", - dns_protocol_to_string(protocol), p->size, p->ifindex, p->ttl, p->fragsize, - strna(sender_address), strna(destination_address)); - } + log_debug("Received %s UDP packet of size %zu, ifindex=%i, ttl=%i, fragsize=%zu, sender=%s, destination=%s", + dns_protocol_to_string(protocol), p->size, p->ifindex, p->ttl, p->fragsize, + IN_ADDR_TO_STRING(p->family, &p->sender), + IN_ADDR_TO_STRING(p->family, &p->destination)); *ret = TAKE_PTR(p); return 1; diff --git a/src/resolve/test-resolved-stream.c b/src/resolve/test-resolved-stream.c index 267fe83bc7..96395ad27a 100644 --- a/src/resolve/test-resolved-stream.c +++ b/src/resolve/test-resolved-stream.c @@ -127,15 +127,15 @@ static void *tls_dns_server(void *p) { int r; _cleanup_close_ int fd_server = -1, fd_tls = -1; _cleanup_free_ char *cert_path = NULL, *key_path = NULL; - _cleanup_free_ char *ip_str = NULL, *bind_str = NULL; + _cleanup_free_ char *bind_str = NULL; assert_se(get_testdata_dir("test-resolve/selfsigned.cert", &cert_path) >= 0); assert_se(get_testdata_dir("test-resolve/selfsigned.key", &key_path) >= 0); - assert_se(in_addr_to_string(server_address.in.sin_family, - sockaddr_in_addr(&server_address.sa), - &ip_str) >= 0); - assert_se(asprintf(&bind_str, "%s:%d", ip_str, be16toh(server_address.in.sin_port)) >= 0); + assert_se(asprintf(&bind_str, "%s:%d", + IN_ADDR_TO_STRING(server_address.in.sin_family, + sockaddr_in_addr(&server_address.sa)), + be16toh(server_address.in.sin_port)) >= 0); /* We will hook one of the socketpair ends to OpenSSL's TLS server * stdin/stdout, so we will be able to read and write plaintext diff --git a/src/test/test-in-addr-util.c b/src/test/test-in-addr-util.c index 636967c240..c0808d51b9 100644 --- a/src/test/test-in-addr-util.c +++ b/src/test/test-in-addr-util.c @@ -347,12 +347,14 @@ TEST(in_addr_prefix_range) { static void test_in_addr_to_string_one(int f, const char *addr) { union in_addr_union ua; - _cleanup_free_ char *r = NULL; + _cleanup_free_ char *r; 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); assert_se(streq(addr, r)); + + assert_se(streq(r, IN_ADDR_TO_STRING(f, &ua))); } TEST(in_addr_to_string) { diff --git a/src/test/test-utmp.c b/src/test/test-utmp.c index 2f66003e65..06a0fce764 100644 --- a/src/test/test-utmp.c +++ b/src/test/test-utmp.c @@ -41,10 +41,7 @@ TEST(dump_run_utmp) { union in_addr_union addr = {}; memcpy(&addr, u->ut_addr_v6, MIN(sizeof(addr), sizeof(u->ut_addr_v6))); - _cleanup_free_ char *pretty = NULL; bool is_ipv4 = memeqzero((const uint8_t*) &addr + 4, sizeof(addr) - 4); - (void) in_addr_to_string(is_ipv4 ? AF_INET : AF_INET6, - &addr, &pretty); log_info("%14s %10"PID_PRI" line=%-7.*s id=%-4.4s name=%-8.*s session=%lu host=%.*s addr=%s", type, @@ -54,7 +51,7 @@ TEST(dump_run_utmp) { UT_NAMESIZE, u->ut_user, (long unsigned) u->ut_session, UT_HOSTSIZE, u->ut_host, - strempty(pretty)); + IN_ADDR_TO_STRING(is_ipv4 ? AF_INET : AF_INET6, &addr)); } } From 94a779628a71e09565c18edebcbdd8c0e0cb391f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 12:21:12 +0200 Subject: [PATCH 2/9] networkctl: assume that we can always print local networking addresses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IN6_ADDR_TO_STRING(…) always returns something, so we can simplify the code a lot. Also, let's not do step-wise concatenation, but instead handle everything with one str_extendf() call. --- src/network/networkctl.c | 59 ++++++++++++---------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index a73bcb0696..c39e4a06e0 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1040,24 +1040,18 @@ static int dump_gateways( return n; for (int i = 0; i < n; i++) { - _cleanup_free_ char *gateway = NULL, *description = NULL; - - r = in_addr_to_string(local[i].family, &local[i].address, &gateway); - if (r < 0) - return log_oom(); + _cleanup_free_ char *description = NULL; r = get_gateway_description(rtnl, hwdb, local[i].ifindex, local[i].family, &local[i].address, &description); if (r < 0) log_debug_errno(r, "Could not get description of gateway, ignoring: %m"); - if (description) { - if (!strextend(&gateway, " (", description, ")")) - return log_oom(); - } - /* Show interface name for the entry if we show entries for all interfaces */ - r = strv_extendf(&buf, "%s%s%s", - gateway, + r = strv_extendf(&buf, "%s%s%s%s%s%s", + IN_ADDR_TO_STRING(local[i].family, &local[i].address), + description ? " (" : "", + strempty(description), + description ? ")" : "", ifindex <= 0 ? " on " : "", ifindex <= 0 ? FORMAT_IFNAME_FULL(local[i].ifindex, FORMAT_IFNAME_IFINDEX_WITH_PERCENT) : ""); if (r < 0) @@ -1089,29 +1083,17 @@ static int dump_addresses( (void) sd_dhcp_lease_get_address(lease, &dhcp4_address); for (int i = 0; i < n; i++) { - _cleanup_free_ char *pretty = NULL; + struct in_addr server_address; + bool dhcp4 = false; - r = in_addr_to_string(local[i].family, &local[i].address, &pretty); - if (r < 0) - return r; + if (local[i].family == AF_INET && in4_addr_equal(&local[i].address.in, &dhcp4_address)) + dhcp4 = sd_dhcp_lease_get_server_identifier(lease, &server_address) >= 0; - if (local[i].family == AF_INET && in4_addr_equal(&local[i].address.in, &dhcp4_address)) { - struct in_addr server_address; - char *p, s[INET_ADDRSTRLEN]; - - r = sd_dhcp_lease_get_server_identifier(lease, &server_address); - if (r >= 0 && inet_ntop(AF_INET, &server_address, s, sizeof(s))) - p = strjoin(pretty, " (DHCP4 via ", s, ")"); - else - p = strjoin(pretty, " (DHCP4)"); - if (!p) - return log_oom(); - - free_and_replace(pretty, p); - } - - r = strv_extendf(&buf, "%s%s%s", - pretty, + r = strv_extendf(&buf, "%s%s%s%s%s%s", + IN_ADDR_TO_STRING(local[i].family, &local[i].address), + dhcp4 ? " (DHCP4 via " : "", + dhcp4 ? IN4_ADDR_TO_STRING(&server_address) : "", + dhcp4 ? ")" : "", ifindex <= 0 ? " on " : "", ifindex <= 0 ? FORMAT_IFNAME_FULL(local[i].ifindex, FORMAT_IFNAME_IFINDEX_WITH_PERCENT) : ""); if (r < 0) @@ -1160,8 +1142,7 @@ static int dump_address_labels(sd_netlink *rtnl) { (void) table_set_align_percent(table, cell, 100); for (sd_netlink_message *m = reply; m; m = sd_netlink_message_next(m)) { - _cleanup_free_ char *pretty = NULL; - union in_addr_union prefix = IN_ADDR_NULL; + struct in6_addr prefix; uint8_t prefixlen; uint32_t label; @@ -1177,11 +1158,7 @@ static int dump_address_labels(sd_netlink *rtnl) { continue; } - r = sd_netlink_message_read_in6_addr(m, IFAL_ADDRESS, &prefix.in6); - if (r < 0) - continue; - - r = in_addr_to_string(AF_INET6, &prefix, &pretty); + r = sd_netlink_message_read_in6_addr(m, IFAL_ADDRESS, &prefix); if (r < 0) continue; @@ -1193,7 +1170,7 @@ static int dump_address_labels(sd_netlink *rtnl) { if (r < 0) return table_log_add_error(r); - r = table_add_cell_stringf(table, NULL, "%s/%u", pretty, prefixlen); + r = table_add_cell_stringf(table, NULL, "%s/%u", IN6_ADDR_TO_STRING(&prefix), prefixlen); if (r < 0) return table_log_add_error(r); } From f69ea167ebd68dea9f7796e1bd49199005244297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 12:21:36 +0200 Subject: [PATCH 3/9] resolved: use TAKE_PTR() in one more place --- src/resolve/resolved-dns-cache.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 3f107603bf..395109dcb2 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -412,7 +412,6 @@ static int dns_cache_put_positive( int owner_family, const union in_addr_union *owner_address) { - _cleanup_(dns_cache_item_freep) DnsCacheItem *i = NULL; char key_str[DNS_RESOURCE_KEY_STRING_MAX]; DnsCacheItem *existing; uint32_t min_ttl; @@ -469,7 +468,7 @@ static int dns_cache_put_positive( dns_cache_make_space(c, 1); - i = new(DnsCacheItem, 1); + _cleanup_(dns_cache_item_freep) DnsCacheItem *i = new(DnsCacheItem, 1); if (!i) return -ENOMEM; @@ -503,7 +502,7 @@ static int dns_cache_put_positive( af_to_name_short(i->owner_family), IN_ADDR_TO_STRING(i->owner_family, &i->owner_address)); - i = NULL; + TAKE_PTR(i); return 0; } From dd6d433a4fddac424db6790c08532dd04babe35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 12:21:53 +0200 Subject: [PATCH 4/9] libsystemd-network: minor simplification --- src/libsystemd-network/sd-radv.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 47339cf239..db9c8a239b 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -247,14 +247,12 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat struct in6_addr src; triple_timestamp timestamp; int r; - ssize_t buflen; - _cleanup_free_ char *buf = NULL; assert(s); assert(ra); assert(ra->event); - buflen = next_datagram_size_fd(fd); + ssize_t buflen = next_datagram_size_fd(fd); if (buflen < 0) { if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen)) return 0; @@ -263,7 +261,7 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat return 0; } - buf = new0(char, buflen); + _cleanup_free_ char *buf = new0(char, buflen); if (!buf) return -ENOMEM; From 61af1813446ced383490fac93e31d6ea3fd5d178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 15:49:40 +0200 Subject: [PATCH 5/9] 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))); From c71384a9ee73c1488d831b09f5ee88a804e1ddcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 3 Jun 2022 16:37:38 +0200 Subject: [PATCH 6/9] basic/in-addr-util: add IN_ADDR_PREFIX_TO_STRING --- src/basic/in-addr-util.c | 35 +++++------ src/basic/in-addr-util.h | 34 ++++++++++- src/core/cgroup.c | 20 ++----- src/core/dbus-cgroup.c | 17 ++---- src/libsystemd-network/sd-radv.c | 27 ++++----- src/network/generator/network-generator.c | 43 +++----------- src/network/netdev/wireguard.c | 10 ++-- src/network/networkd-address-pool.c | 7 +-- src/network/networkd-address.c | 12 ++-- src/network/networkd-dhcp-prefix-delegation.c | 59 +++++++------------ src/network/networkd-link.c | 9 +-- src/network/networkd-ndisc.c | 37 +++++------- src/network/networkd-radv.c | 12 ++-- src/network/networkd-route.c | 14 +++-- src/network/networkd-routing-policy-rule.c | 8 +-- src/systemctl/systemctl-show.c | 7 +-- src/test/test-in-addr-prefix-util.c | 16 +++-- src/test/test-in-addr-util.c | 11 ++-- 18 files changed, 155 insertions(+), 223 deletions(-) diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index 6bf017260b..6f8ffaf259 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -14,6 +14,7 @@ #include "macro.h" #include "parse-util.h" #include "random-util.h" +#include "stdio-util.h" #include "string-util.h" #include "strxcpyx.h" #include "util.h" @@ -451,34 +452,26 @@ int in_addr_to_string(int family, const union in_addr_union *u, char **ret) { return 0; } -int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret) { - _cleanup_free_ char *x = NULL; - char *p; - size_t l; +int in_addr_prefix_to_string( + int family, + const union in_addr_union *u, + unsigned prefixlen, + char *buf, + size_t buf_len) { assert(u); - assert(ret); + assert(buf); - if (family == AF_INET) - l = INET_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned); - else if (family == AF_INET6) - l = INET6_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned); - else + if (!IN_SET(family, AF_INET, AF_INET6)) return -EAFNOSUPPORT; - x = new(char, l); - if (!x) - return -ENOMEM; - errno = 0; - if (!inet_ntop(family, u, x, l)) - return errno_or_else(EINVAL); + if (!typesafe_inet_ntop(family, u, buf, buf_len)) + return errno_or_else(ENOSPC); - p = x + strlen(x); - l -= strlen(x); - (void) strpcpyf(&p, l, "/%u", prefixlen); - - *ret = TAKE_PTR(x); + size_t l = strlen(buf); + if (!snprintf_ok(buf + l, buf_len - l, "/%u", prefixlen)) + return -ENOSPC; return 0; } diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 89d0505c13..c1e7ef965d 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -93,10 +93,38 @@ static inline const char* typesafe_inet_ntop6(const struct in6_addr *a, char *bu #define IN4_ADDR_TO_STRING(addr) typesafe_inet_ntop4(addr, (char[INET_ADDRSTRLEN]){}, INET_ADDRSTRLEN) #define IN6_ADDR_TO_STRING(addr) typesafe_inet_ntop6(addr, (char[INET6_ADDRSTRLEN]){}, INET6_ADDRSTRLEN) -int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret); -static inline int in6_addr_prefix_to_string(const struct in6_addr *u, unsigned prefixlen, char **ret) { - return in_addr_prefix_to_string(AF_INET6, (const union in_addr_union*) u, prefixlen, ret); +int in_addr_prefix_to_string( + int family, + const union in_addr_union *u, + unsigned prefixlen, + char *buf, + size_t buf_len); + +static inline const char* _in_addr_prefix_to_string( + int family, + const union in_addr_union *u, + unsigned prefixlen, + char *buf, + size_t buf_len) { + /* We assume that this is called with an appropriately sized buffer and can never fail. */ + assert_se(in_addr_prefix_to_string(family, u, prefixlen, buf, buf_len) == 0); + return buf; } +static inline const char* _in4_addr_prefix_to_string(const struct in_addr *a, unsigned prefixlen, char *buf, size_t buf_len) { + return _in_addr_prefix_to_string(AF_INET, (const union in_addr_union *) a, prefixlen, buf, buf_len); +} +static inline const char* _in6_addr_prefix_to_string(const struct in6_addr *a, unsigned prefixlen, char *buf, size_t buf_len) { + return _in_addr_prefix_to_string(AF_INET6, (const union in_addr_union *) a, prefixlen, buf, buf_len); +} + +#define PREFIX_SUFFIX_MAX (1 + DECIMAL_STR_MAX(unsigned)) +#define IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen) \ + _in_addr_prefix_to_string(family, addr, prefixlen, (char[IN_ADDR_MAX + PREFIX_SUFFIX_MAX]){}, IN_ADDR_MAX + PREFIX_SUFFIX_MAX) +#define IN4_ADDR_PREFIX_TO_STRING(addr, prefixlen) \ + _in4_addr_prefix_to_string(addr, prefixlen, (char[INET_ADDRSTRLEN + PREFIX_SUFFIX_MAX]){}, INET_ADDRSTRLEN + PREFIX_SUFFIX_MAX) +#define IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen) \ + _in6_addr_prefix_to_string(addr, prefixlen, (char[INET6_ADDRSTRLEN + PREFIX_SUFFIX_MAX]){}, INET6_ADDRSTRLEN + PREFIX_SUFFIX_MAX) + int in_addr_port_ifindex_name_to_string(int family, const union in_addr_union *u, uint16_t port, int ifindex, const char *server_name, char **ret); static inline int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifindex, char **ret) { return in_addr_port_ifindex_name_to_string(family, u, 0, ifindex, NULL, ret); diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 9282b1ff20..25707fce64 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -574,23 +574,15 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) { FORMAT_BYTES(b->wbps)); } - SET_FOREACH(iaai, c->ip_address_allow) { - _cleanup_free_ char *k = NULL; - - (void) in_addr_prefix_to_string(iaai->family, &iaai->address, iaai->prefixlen, &k); - fprintf(f, "%sIPAddressAllow: %s\n", prefix, strnull(k)); - } - - SET_FOREACH(iaai, c->ip_address_deny) { - _cleanup_free_ char *k = NULL; - - (void) in_addr_prefix_to_string(iaai->family, &iaai->address, iaai->prefixlen, &k); - fprintf(f, "%sIPAddressDeny: %s\n", prefix, strnull(k)); - } + SET_FOREACH(iaai, c->ip_address_allow) + fprintf(f, "%sIPAddressAllow: %s\n", prefix, + IN_ADDR_PREFIX_TO_STRING(iaai->family, &iaai->address, iaai->prefixlen)); + SET_FOREACH(iaai, c->ip_address_deny) + fprintf(f, "%sIPAddressDeny: %s\n", prefix, + IN_ADDR_PREFIX_TO_STRING(iaai->family, &iaai->address, iaai->prefixlen)); STRV_FOREACH(path, c->ip_filters_ingress) fprintf(f, "%sIPIngressFilterPath: %s\n", prefix, *path); - STRV_FOREACH(path, c->ip_filters_egress) fprintf(f, "%sIPEgressFilterPath: %s\n", prefix, *path); diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 9a31355a4d..607370d7bf 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -1817,25 +1817,16 @@ int bus_cgroup_set_property( fputs(name, f); fputs("=\n", f); } else { - struct in_addr_prefix *p; - *reduced = false; r = in_addr_prefixes_merge(prefixes, new_prefixes); if (r < 0) return r; - SET_FOREACH(p, new_prefixes) { - _cleanup_free_ char *buffer = NULL; - - r = in_addr_prefix_to_string(p->family, &p->address, p->prefixlen, &buffer); - if (r == -ENOMEM) - return r; - if (r < 0) - continue; - - fprintf(f, "%s=%s\n", name, buffer); - } + const struct in_addr_prefix *p; + SET_FOREACH(p, new_prefixes) + fprintf(f, "%s=%s\n", name, + IN_ADDR_PREFIX_TO_STRING(p->family, &p->address, p->prefixlen)); } r = fflush_and_check(f); diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index db9c8a239b..a1f50afce3 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -572,7 +572,6 @@ int sd_radv_set_preference(sd_radv *ra, unsigned preference) { } int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { - _cleanup_free_ char *addr_p = NULL; sd_radv_prefix *found = NULL; int r; @@ -583,10 +582,9 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { if (in6_addr_is_null(&p->opt.in6_addr)) return -ENOEXEC; - (void) in6_addr_prefix_to_string(&p->opt.in6_addr, p->opt.prefixlen, &addr_p); + const char *addr_p = IN6_ADDR_PREFIX_TO_STRING(&p->opt.in6_addr, p->opt.prefixlen); LIST_FOREACH(prefix, cur, ra->prefixes) { - r = in_addr_prefix_intersect(AF_INET6, (const union in_addr_union*) &cur->opt.in6_addr, cur->opt.prefixlen, @@ -602,11 +600,10 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { break; } - _cleanup_free_ char *addr_cur = NULL; - (void) in6_addr_prefix_to_string(&cur->opt.in6_addr, cur->opt.prefixlen, &addr_cur); return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST), "IPv6 prefix %s conflicts with %s, ignoring.", - strna(addr_p), strna(addr_cur)); + addr_p, + IN6_ADDR_PREFIX_TO_STRING(&cur->opt.in6_addr, cur->opt.prefixlen)); } if (found) { @@ -621,7 +618,7 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { LIST_APPEND(prefix, ra->prefixes, p); log_radv(ra, "Updated/replaced IPv6 prefix %s (preferred: %s, valid: %s)", - strna(addr_p), + addr_p, FORMAT_TIMESPAN(p->lifetime_preferred_usec, USEC_PER_SEC), FORMAT_TIMESPAN(p->lifetime_valid_usec, USEC_PER_SEC)); } else { @@ -631,7 +628,7 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { LIST_APPEND(prefix, ra->prefixes, p); ra->n_prefixes++; - log_radv(ra, "Added prefix %s", strna(addr_p)); + log_radv(ra, "Added prefix %s", addr_p); } if (ra->state == RADV_STATE_IDLE) @@ -643,10 +640,9 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) { /* If RAs have already been sent, send an RA immediately to announce the newly-added prefix */ r = radv_send(ra, NULL, ra->lifetime_usec); if (r < 0) - log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix %s: %m", - strna(addr_p)); + log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix %s: %m", addr_p); else - log_radv(ra, "Sent Router Advertisement for added/updated prefix %s.", strna(addr_p)); + log_radv(ra, "Sent Router Advertisement for added/updated prefix %s.", addr_p); return 0; } @@ -677,17 +673,15 @@ void sd_radv_remove_prefix( } int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p) { - _cleanup_free_ char *addr_p = NULL; sd_radv_route_prefix *found = NULL; int r; assert_return(ra, -EINVAL); assert_return(p, -EINVAL); - (void) in6_addr_prefix_to_string(&p->opt.in6_addr, p->opt.prefixlen, &addr_p); + const char *addr_p = IN6_ADDR_PREFIX_TO_STRING(&p->opt.in6_addr, p->opt.prefixlen); LIST_FOREACH(prefix, cur, ra->route_prefixes) { - r = in_addr_prefix_intersect(AF_INET6, (const union in_addr_union*) &cur->opt.in6_addr, cur->opt.prefixlen, @@ -703,11 +697,10 @@ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p) { break; } - _cleanup_free_ char *addr_cur = NULL; - (void) in6_addr_prefix_to_string(&cur->opt.in6_addr, cur->opt.prefixlen, &addr_cur); return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST), "IPv6 route prefix %s conflicts with %s, ignoring.", - strna(addr_p), strna(addr_cur)); + addr_p, + IN6_ADDR_PREFIX_TO_STRING(&cur->opt.in6_addr, cur->opt.prefixlen)); } if (found) { diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c index a1b5511338..fee222f88e 100644 --- a/src/network/generator/network-generator.c +++ b/src/network/generator/network-generator.c @@ -1081,48 +1081,23 @@ void context_clear(Context *context) { } static int address_dump(Address *address, FILE *f) { - _cleanup_free_ char *addr = NULL, *peer = NULL; - int r; - - r = in_addr_prefix_to_string(address->family, &address->address, address->prefixlen, &addr); - if (r < 0) - return r; - - if (in_addr_is_set(address->family, &address->peer)) { - r = in_addr_to_string(address->family, &address->peer, &peer); - if (r < 0) - return r; - } - fprintf(f, "\n[Address]\n" "Address=%s\n", - addr); - - if (peer) - fprintf(f, "Peer=%s\n", peer); - + IN_ADDR_PREFIX_TO_STRING(address->family, &address->address, address->prefixlen)); + if (in_addr_is_set(address->family, &address->peer)) + fprintf(f, "Peer=%s\n", + IN_ADDR_TO_STRING(address->family, &address->peer)); return 0; } static int route_dump(Route *route, FILE *f) { - _cleanup_free_ char *dest = NULL, *gateway = NULL; - int r; - - if (in_addr_is_set(route->family, &route->dest)) { - r = in_addr_prefix_to_string(route->family, &route->dest, route->prefixlen, &dest); - if (r < 0) - return r; - } - - r = in_addr_to_string(route->family, &route->gateway, &gateway); - if (r < 0) - return r; - fputs("\n[Route]\n", f); - if (dest) - fprintf(f, "Destination=%s\n", dest); - fprintf(f, "Gateway=%s\n", gateway); + if (in_addr_is_set(route->family, &route->dest)) + fprintf(f, "Destination=%s\n", + IN_ADDR_PREFIX_TO_STRING(route->family, &route->dest, route->prefixlen)); + fprintf(f, "Gateway=%s\n", + IN_ADDR_TO_STRING(route->family, &route->gateway)); return 0; } diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index fc2c6288ae..2667a9fb2a 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -712,13 +712,11 @@ int config_parse_wireguard_allowed_ips( masked = addr; assert_se(in_addr_mask(family, &masked, prefixlen) >= 0); - if (!in_addr_equal(family, &masked, &addr)) { - _cleanup_free_ char *buf = NULL; - - (void) in_addr_prefix_to_string(family, &masked, prefixlen, &buf); + if (!in_addr_equal(family, &masked, &addr)) log_syntax(unit, LOG_WARNING, filename, line, 0, - "Specified address '%s' is not properly masked, assuming '%s'.", word, strna(buf)); - } + "Specified address '%s' is not properly masked, assuming '%s'.", + word, + IN_ADDR_PREFIX_TO_STRING(family, &masked, prefixlen)); ipmask = new(WireguardIPmask, 1); if (!ipmask) diff --git a/src/network/networkd-address-pool.c b/src/network/networkd-address-pool.c index 47dedfe6f2..51f092ac69 100644 --- a/src/network/networkd-address-pool.c +++ b/src/network/networkd-address-pool.c @@ -146,12 +146,7 @@ static int address_pool_acquire_one(AddressPool *p, int family, unsigned prefixl return r; if (!address_pool_prefix_is_taken(p, &u, prefixlen)) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *s = NULL; - - (void) in_addr_prefix_to_string(p->family, &u, prefixlen, &s); - log_debug("Found range %s", strna(s)); - } + log_debug("Found range %s", IN_ADDR_PREFIX_TO_STRING(p->family, &u, prefixlen)); *found = u; return 1; diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 5e37dc9907..8e8d5f7781 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1465,11 +1465,8 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, r = address_add(link, tmp); if (r < 0) { - _cleanup_free_ char *buf = NULL; - - (void) in_addr_prefix_to_string(tmp->family, &tmp->in_addr, tmp->prefixlen, &buf); log_link_warning_errno(link, r, "Failed to remember foreign address %s, ignoring: %m", - strnull(buf)); + IN_ADDR_PREFIX_TO_STRING(tmp->family, &tmp->in_addr, tmp->prefixlen)); return 0; } @@ -2022,12 +2019,11 @@ int network_drop_invalid_addresses(Network *network) { /* Always use the setting specified later. So, remove the previously assigned setting. */ dup = set_remove(addresses, address); if (dup) { - _cleanup_free_ char *buf = NULL; - - (void) in_addr_prefix_to_string(address->family, &address->in_addr, address->prefixlen, &buf); log_warning("%s: Duplicated address %s is specified at line %u and %u, " "dropping the address setting specified at line %u.", - dup->section->filename, strna(buf), address->section->line, + dup->section->filename, + IN_ADDR_PREFIX_TO_STRING(address->family, &address->in_addr, address->prefixlen), + address->section->line, dup->section->line, dup->section->line); /* address_free() will drop the address from addresses_by_section. */ address_free(dup); diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index d8d9475635..5c923c258c 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -358,21 +358,16 @@ static int dhcp_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Requ } static void log_dhcp_pd_address(Link *link, const Address *address) { - _cleanup_free_ char *buffer = NULL; - int log_level; - assert(address); assert(address->family == AF_INET6); - log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO; + int log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO; if (log_level < log_get_max_level()) return; - (void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer); - log_link_full(link, log_level, "DHCP-PD address %s (valid %s, preferred %s)", - strna(buffer), + IN6_ADDR_PREFIX_TO_STRING(&address->in_addr.in6, address->prefixlen), FORMAT_LIFETIME(address->lifetime_valid_usec), FORMAT_LIFETIME(address->lifetime_preferred_usec)); } @@ -524,7 +519,6 @@ static int dhcp_pd_assign_subnet_prefix( usec_t lifetime_valid_usec, bool is_uplink) { - _cleanup_free_ char *buf = NULL; struct in6_addr prefix; int r; @@ -536,7 +530,7 @@ static int dhcp_pd_assign_subnet_prefix( if (r < 0) return r == -ERANGE ? 0 : r; - (void) in6_addr_prefix_to_string(&prefix, 64, &buf); + const char *pretty = IN6_ADDR_PREFIX_TO_STRING(&prefix, 64); if (link_radv_enabled(link) && link->network->dhcp_pd_announce) { if (is_uplink) @@ -546,23 +540,21 @@ static int dhcp_pd_assign_subnet_prefix( if (r < 0) return log_link_warning_errno(link, r, "Failed to assign/update prefix %s to IPv6 Router Advertisement: %m", - strna(buf)); + pretty); } } r = dhcp_pd_request_route(link, &prefix, lifetime_valid_usec); if (r < 0) return log_link_warning_errno(link, r, - "Failed to assign/update route for prefix %s: %m", - strna(buf)); + "Failed to assign/update route for prefix %s: %m", pretty); r = dhcp_pd_request_address(link, &prefix, lifetime_preferred_usec, lifetime_valid_usec); if (r < 0) return log_link_warning_errno(link, r, - "Failed to assign/update address for prefix %s: %m", - strna(buf)); + "Failed to assign/update address for prefix %s: %m", pretty); - log_link_debug(link, "Assigned prefix %s", strna(buf)); + log_link_debug(link, "Assigned prefix %s", pretty); return 1; } @@ -706,11 +698,8 @@ static int dhcp_request_unreachable_route( assert(callback); if (prefixlen >= 64) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_prefix_to_string(addr, prefixlen, &buf); log_link_debug(link, "Not adding a blocking route for DHCP delegated prefix %s since the prefix has length >= 64.", - strna(buf)); + IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen)); return 0; } @@ -734,13 +723,9 @@ static int dhcp_request_unreachable_route( route_unmark(existing); r = link_request_route(link, TAKE_PTR(route), true, counter, callback, NULL); - if (r < 0) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_prefix_to_string(addr, prefixlen, &buf); + if (r < 0) return log_link_error_errno(link, r, "Failed to request unreachable route for DHCP delegated prefix %s: %m", - strna(buf)); - } + IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen)); return 0; } @@ -770,7 +755,6 @@ static int dhcp6_request_unreachable_route( } static int dhcp_pd_prefix_add(Link *link, const struct in6_addr *prefix, uint8_t prefixlen) { - _cleanup_free_ char *buf = NULL; struct in_addr_prefix *p; int r; @@ -787,21 +771,20 @@ static int dhcp_pd_prefix_add(Link *link, const struct in6_addr *prefix, uint8_t .address.in6 = *prefix, }; - (void) in6_addr_prefix_to_string(prefix, prefixlen, &buf); - + int log_level = set_contains(link->dhcp_pd_prefixes, p) ? LOG_DEBUG : + prefixlen > 64 || prefixlen < 48 ? LOG_WARNING : LOG_INFO; log_link_full(link, - set_contains(link->dhcp_pd_prefixes, p) ? LOG_DEBUG : - prefixlen > 64 || prefixlen < 48 ? LOG_WARNING : LOG_INFO, + log_level, "DHCP: received delegated prefix %s%s", - strna(buf), + IN6_ADDR_PREFIX_TO_STRING(prefix, prefixlen), prefixlen > 64 ? " with prefix length > 64, ignoring." : prefixlen < 48 ? " with prefix length < 48, looks unusual.": ""); /* Store PD prefix even if prefixlen > 64, not to make logged at warning level so frequently. */ r = set_ensure_consume(&link->dhcp_pd_prefixes, &in_addr_prefix_hash_ops_free, p); if (r < 0) - return log_link_error_errno(link, r, "Failed to store DHCP delegated prefix %s: %m", strna(buf)); - + return log_link_error_errno(link, r, "Failed to store DHCP delegated prefix %s: %m", + IN6_ADDR_PREFIX_TO_STRING(prefix, prefixlen)); return 0; } @@ -968,13 +951,11 @@ int dhcp4_pd_prefix_acquired(Link *uplink) { if (r < 0) return log_link_warning_errno(uplink, r, "Failed to get DHCPv4 6rd option: %m"); - if (DEBUG_LOGGING) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_prefix_to_string(&sixrd_prefix, sixrd_prefixlen, &buf); + if (DEBUG_LOGGING) log_link_debug(uplink, "DHCPv4: 6rd option is acquired: IPv4_masklen=%u, 6rd_prefix=%s, br_address="IPV4_ADDRESS_FMT_STR, - ipv4masklen, strna(buf), IPV4_ADDRESS_FMT_VAL(*br_addresses)); - } + ipv4masklen, + IN6_ADDR_PREFIX_TO_STRING(&sixrd_prefix, sixrd_prefixlen), + IPV4_ADDRESS_FMT_VAL(*br_addresses)); /* Calculate PD prefix */ dhcp4_calculate_pd_prefix(&ipv4address, ipv4masklen, &sixrd_prefix, sixrd_prefixlen, &pd_prefix, &pd_prefixlen); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 63679505f7..e781f54a3c 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -426,12 +426,9 @@ void link_check_ready(Link *link) { return (void) log_link_debug(link, "%s(): static addresses are not configured.", __func__); SET_FOREACH(a, link->addresses) - if (!address_is_ready(a)) { - _cleanup_free_ char *str = NULL; - - (void) in_addr_prefix_to_string(a->family, &a->in_addr, a->prefixlen, &str); - return (void) log_link_debug(link, "%s(): address %s is not ready.", __func__, strna(str)); - } + if (!address_is_ready(a)) + return (void) log_link_debug(link, "%s(): address %s is not ready.", __func__, + IN_ADDR_PREFIX_TO_STRING(a->family, &a->in_addr, a->prefixlen)); if (!link->static_address_labels_configured) return (void) log_link_debug(link, "%s(): static address labels are not configured.", __func__); diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 66127f36c9..2b663e57cc 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -420,10 +420,8 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r /* ndisc_generate_addresses() below requires the prefix length <= 64. */ if (prefixlen > 64) { - _cleanup_free_ char *buf = NULL; - - (void) in6_addr_prefix_to_string(&prefix, prefixlen, &buf); - log_link_debug(link, "Prefix is longer than 64, ignoring autonomous prefix %s.", strna(buf)); + log_link_debug(link, "Prefix is longer than 64, ignoring autonomous prefix %s.", + IN6_ADDR_PREFIX_TO_STRING(&prefix, prefixlen)); return 0; } @@ -553,15 +551,11 @@ static int ndisc_router_process_prefix(Link *link, sd_ndisc_router *rt) { return log_link_error_errno(link, r, "Failed to get prefix length: %m"); if (in6_prefix_is_filtered(&a, prefixlen, link->network->ndisc_allow_listed_prefix, link->network->ndisc_deny_listed_prefix)) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *b = NULL; - - (void) in6_addr_prefix_to_string(&a, prefixlen, &b); - if (!set_isempty(link->network->ndisc_allow_listed_prefix)) - log_link_debug(link, "Prefix '%s' is not in allow list, ignoring", strna(b)); - else - log_link_debug(link, "Prefix '%s' is in deny list, ignoring", strna(b)); - } + if (DEBUG_LOGGING) + log_link_debug(link, "Prefix '%s' is %s, ignoring", + !set_isempty(link->network->ndisc_allow_listed_prefix) ? "not in allow list" + : "in deny list", + IN6_ADDR_PREFIX_TO_STRING(&a, prefixlen)); return 0; } @@ -617,16 +611,15 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) { return 0; } - if (in6_prefix_is_filtered(&dst, prefixlen, link->network->ndisc_allow_listed_route_prefix, link->network->ndisc_deny_listed_route_prefix)) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *buf = NULL; + if (in6_prefix_is_filtered(&dst, prefixlen, + link->network->ndisc_allow_listed_route_prefix, + link->network->ndisc_deny_listed_route_prefix)) { - (void) in6_addr_prefix_to_string(&dst, prefixlen, &buf); - if (!set_isempty(link->network->ndisc_allow_listed_route_prefix)) - log_link_debug(link, "Route prefix '%s' is not in allow list, ignoring", strna(buf)); - else - log_link_debug(link, "Route prefix '%s' is in deny list, ignoring", strna(buf)); - } + if (DEBUG_LOGGING) + log_link_debug(link, "Route prefix %s is %s, ignoring", + !set_isempty(link->network->ndisc_allow_listed_route_prefix) ? "not in allow list" + : "in deny list", + IN6_ADDR_PREFIX_TO_STRING(&dst, prefixlen)); return 0; } diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 7fc1306d19..26448b518d 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -711,15 +711,11 @@ static int prefix_section_verify(Prefix *p) { p->section->filename, p->prefixlen, p->section->line); if (p->prefixlen > 64) { - _cleanup_free_ char *str = NULL; - - if (p->assign) - (void) in6_addr_prefix_to_string(&p->prefix, p->prefixlen, &str); - - log_info("%s: Unusual prefix length %u (> 64) is specified in [IPv6Prefix] section from line %u%s%s.", - p->section->filename, p->prefixlen, p->section->line, + log_info("%s:%u: Unusual prefix length %u (> 64) is specified in [IPv6Prefix] section from line %s%s.", + p->section->filename, p->section->line, + p->prefixlen, p->assign ? ", refusing to assign an address in " : "", - p->assign ? strna(str) : ""); + p->assign ? IN6_ADDR_PREFIX_TO_STRING(&p->prefix, p->prefixlen) : ""); p->assign = false; } diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 934fed3b7f..2708f9d79d 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -544,9 +544,9 @@ void link_mark_routes(Link *link, NetworkConfigSource source, const struct in6_a } static void log_route_debug(const Route *route, const char *str, const Link *link, const Manager *manager) { - _cleanup_free_ char *state = NULL, *dst = NULL, *src = NULL, *gw_alloc = NULL, *prefsrc = NULL, + _cleanup_free_ char *state = NULL, *gw_alloc = NULL, *prefsrc = NULL, *table = NULL, *scope = NULL, *proto = NULL, *flags = NULL; - const char *gw = NULL; + const char *gw = NULL, *dst, *src; assert(route); assert(str); @@ -558,10 +558,12 @@ static void log_route_debug(const Route *route, const char *str, const Link *lin return; (void) network_config_state_to_string_alloc(route->state, &state); - if (in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0) - (void) in_addr_prefix_to_string(route->family, &route->dst, route->dst_prefixlen, &dst); - if (in_addr_is_set(route->family, &route->src) || route->src_prefixlen > 0) - (void) in_addr_prefix_to_string(route->family, &route->src, route->src_prefixlen, &src); + + dst = in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0 ? + IN_ADDR_PREFIX_TO_STRING(route->family, &route->dst, route->dst_prefixlen) : NULL; + src = in_addr_is_set(route->family, &route->src) || route->src_prefixlen > 0 ? + IN_ADDR_PREFIX_TO_STRING(route->family, &route->src, route->src_prefixlen) : NULL; + if (in_addr_is_set(route->gw_family, &route->gw)) { (void) in_addr_to_string(route->gw_family, &route->gw, &gw_alloc); gw = gw_alloc; diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 8f4297a86a..71c4360fa3 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -414,7 +414,7 @@ static int routing_policy_rule_acquire_priority(Manager *manager, RoutingPolicyR } static void log_routing_policy_rule_debug(const RoutingPolicyRule *rule, const char *str, const Link *link, const Manager *m) { - _cleanup_free_ char *state = NULL, *from = NULL, *to = NULL, *table = NULL; + _cleanup_free_ char *state = NULL, *table = NULL; assert(rule); assert(IN_SET(rule->family, AF_INET, AF_INET6)); @@ -427,14 +427,14 @@ static void log_routing_policy_rule_debug(const RoutingPolicyRule *rule, const c return; (void) network_config_state_to_string_alloc(rule->state, &state); - (void) in_addr_prefix_to_string(rule->family, &rule->from, rule->from_prefixlen, &from); - (void) in_addr_prefix_to_string(rule->family, &rule->to, rule->to_prefixlen, &to); (void) manager_get_route_table_to_string(m, rule->table, &table); log_link_debug(link, "%s %s routing policy rule (%s): priority: %"PRIu32", %s -> %s, iif: %s, oif: %s, table: %s", str, strna(network_config_source_to_string(rule->source)), strna(state), - rule->priority, strna(from), strna(to), + rule->priority, + IN_ADDR_PREFIX_TO_STRING(rule->family, &rule->from, rule->from_prefixlen), + IN_ADDR_PREFIX_TO_STRING(rule->family, &rule->to, rule->to_prefixlen), strna(rule->iif), strna(rule->oif), strna(table)); } diff --git a/src/systemctl/systemctl-show.c b/src/systemctl/systemctl-show.c index cc7abca6df..b24e5fd6ba 100644 --- a/src/systemctl/systemctl-show.c +++ b/src/systemctl/systemctl-show.c @@ -1454,7 +1454,6 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m return bus_log_parse_error(r); for (;;) { - _cleanup_free_ char *str = NULL; uint32_t prefixlen; int32_t family; const void *ap; @@ -1491,10 +1490,8 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m if (prefixlen > FAMILY_ADDRESS_SIZE(family) * 8) continue; - if (in_addr_prefix_to_string(family, (const union in_addr_union*) ap, prefixlen, &str) < 0) - continue; - - if (!strextend_with_separator(&addresses, " ", str)) + if (!strextend_with_separator(&addresses, " ", + IN_ADDR_PREFIX_TO_STRING(family, ap, prefixlen))) return log_oom(); } diff --git a/src/test/test-in-addr-prefix-util.c b/src/test/test-in-addr-prefix-util.c index d2991b9d3d..661ca8fc81 100644 --- a/src/test/test-in-addr-prefix-util.c +++ b/src/test/test-in-addr-prefix-util.c @@ -5,12 +5,15 @@ 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); + + const char *r = IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen); + assert_se(r); printf("%s: %s/%u == %s\n", __func__, addr, prefixlen, r); assert_se(startswith(r, addr)); + + assert_se(streq(r, IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen))); + assert_se(streq(IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen), r)); } TEST(in_addr_to_string_prefix) { @@ -27,10 +30,13 @@ TEST(in_addr_to_string_prefix) { } 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; + const char *str = IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen); + assert_se(str); - assert_se(in_addr_prefix_to_string(family, addr, prefixlen, &str) >= 0); assert_se(config_parse_in_addr_prefixes("unit", "filename", 1, "Service", 1, "IPAddressAllow", 0, str, prefixes, NULL) >= 0); + + assert_se(streq(str, IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen))); + assert_se(streq(IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen), str)); } static void test_config_parse_in_addr_prefixes(Set **ret) { diff --git a/src/test/test-in-addr-util.c b/src/test/test-in-addr-util.c index 296cd27434..f5dcad65d5 100644 --- a/src/test/test-in-addr-util.c +++ b/src/test/test-in-addr-util.c @@ -86,28 +86,27 @@ TEST(in_addr_prefix_from_string) { } static void test_in_addr_prefix_to_string_valid(int family, const char *p) { - _cleanup_free_ char *str = NULL; union in_addr_union u; unsigned char l; log_info("%s: %s", __func__, p); assert_se(in_addr_prefix_from_string(p, family, &u, &l) >= 0); - assert_se(in_addr_prefix_to_string(family, &u, l, &str) >= 0); - assert_se(streq(str, p)); + assert_se(streq(p, IN_ADDR_PREFIX_TO_STRING(family, &u, l))); } static void test_in_addr_prefix_to_string_unoptimized(int family, const char *p) { - _cleanup_free_ char *str1 = NULL, *str2 = NULL; union in_addr_union u1, u2; unsigned char len1, len2; log_info("%s: %s", __func__, p); assert_se(in_addr_prefix_from_string(p, family, &u1, &len1) >= 0); - assert_se(in_addr_prefix_to_string(family, &u1, len1, &str1) >= 0); + const char *str1 = IN_ADDR_PREFIX_TO_STRING(family, &u1, len1); + assert_se(str1); assert_se(in_addr_prefix_from_string(str1, family, &u2, &len2) >= 0); - assert_se(in_addr_prefix_to_string(family, &u2, len2, &str2) >= 0); + const char *str2 = IN_ADDR_PREFIX_TO_STRING(family, &u2, len2); + assert_se(str2); assert_se(streq(str1, str2)); assert_se(len1 == len2); From 071e522eec2d4f5f29ef929db4bf40af1860fdac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 4 Jun 2022 17:01:06 +0200 Subject: [PATCH 7/9] tree-wide: convert inet_ntop() calls to anonymous-buffer macros --- src/basic/socket-util.c | 4 +--- src/core/socket.c | 6 ++---- src/libsystemd-network/network-internal.c | 15 ++++++--------- src/libsystemd-network/sd-dhcp-lease.c | 11 +++++------ src/libsystemd-network/test-ndisc-rs.c | 9 +++------ src/machine/machinectl.c | 9 ++------- 6 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index bd6d329d94..4925fd093e 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -490,9 +490,7 @@ int sockaddr_pretty( if (r < 0) return -ENOMEM; } else { - char a[INET6_ADDRSTRLEN]; - - inet_ntop(AF_INET6, &sa->in6.sin6_addr, a, sizeof(a)); + const char *a = IN6_ADDR_TO_STRING(&sa->in6.sin6_addr); if (include_port) { if (asprintf(&p, diff --git a/src/core/socket.c b/src/core/socket.c index 0d96f1a933..af39553001 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -858,14 +858,12 @@ static int instance_from_socket(int fd, unsigned nr, char **instance) { be16toh(remote.in6.sin6_port)) < 0) return -ENOMEM; } else { - char a[INET6_ADDRSTRLEN], b[INET6_ADDRSTRLEN]; - if (asprintf(&r, "%u-%s:%u-%s:%u", nr, - inet_ntop(AF_INET6, &local.in6.sin6_addr, a, sizeof(a)), + IN6_ADDR_TO_STRING(&local.in6.sin6_addr), be16toh(local.in6.sin6_port), - inet_ntop(AF_INET6, &remote.in6.sin6_addr, b, sizeof(b)), + IN6_ADDR_TO_STRING(&remote.in6.sin6_addr), be16toh(remote.in6.sin6_port)) < 0) return -ENOMEM; } diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index bc7aec2f9d..cd32a7247a 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -28,14 +28,12 @@ size_t serialize_in_addrs(FILE *f, with_leading_space = &_space; for (size_t i = 0; i < size; i++) { - char sbuf[INET_ADDRSTRLEN]; - if (predicate && !predicate(&addresses[i])) continue; if (*with_leading_space) fputc(' ', f); - fputs(inet_ntop(AF_INET, &addresses[i], sbuf, sizeof(sbuf)), f); + fputs(IN4_ADDR_TO_STRING(&addresses[i]), f); count++; *with_leading_space = true; } @@ -89,11 +87,9 @@ void serialize_in6_addrs(FILE *f, const struct in6_addr *addresses, size_t size, with_leading_space = &_space; for (size_t i = 0; i < size; i++) { - char buffer[INET6_ADDRSTRLEN]; - if (*with_leading_space) fputc(' ', f); - fputs(inet_ntop(AF_INET6, addresses+i, buffer, sizeof(buffer)), f); + fputs(IN6_ADDR_TO_STRING(&addresses[i]), f); *with_leading_space = true; } } @@ -143,7 +139,6 @@ void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, siz fprintf(f, "%s=", key); for (size_t i = 0; i < size; i++) { - char sbuf[INET_ADDRSTRLEN]; struct in_addr dest, gw; uint8_t length; @@ -151,8 +146,10 @@ void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, siz assert_se(sd_dhcp_route_get_gateway(routes[i], &gw) >= 0); assert_se(sd_dhcp_route_get_destination_prefix_length(routes[i], &length) >= 0); - fprintf(f, "%s/%" PRIu8, inet_ntop(AF_INET, &dest, sbuf, sizeof sbuf), length); - fprintf(f, ",%s%s", inet_ntop(AF_INET, &gw, sbuf, sizeof sbuf), i < size - 1 ? " ": ""); + fprintf(f, "%s,%s%s", + IN4_ADDR_PREFIX_TO_STRING(&dest, length), + IN4_ADDR_TO_STRING(&gw), + i < size - 1 ? " ": ""); } fputs("\n", f); diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 8de7c671df..acc57ce53a 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -967,7 +967,6 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { const struct in_addr *addresses; const void *client_id, *data; size_t client_id_len, data_len; - char sbuf[INET_ADDRSTRLEN]; const char *string; uint16_t mtu; _cleanup_free_ sd_dhcp_route **routes = NULL; @@ -989,11 +988,11 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { r = sd_dhcp_lease_get_address(lease, &address); if (r >= 0) - fprintf(f, "ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf))); + fprintf(f, "ADDRESS=%s\n", IN4_ADDR_TO_STRING(&address)); r = sd_dhcp_lease_get_netmask(lease, &address); if (r >= 0) - fprintf(f, "NETMASK=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf))); + fprintf(f, "NETMASK=%s\n", IN4_ADDR_TO_STRING(&address)); r = sd_dhcp_lease_get_router(lease, &addresses); if (r > 0) { @@ -1004,15 +1003,15 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { r = sd_dhcp_lease_get_server_identifier(lease, &address); if (r >= 0) - fprintf(f, "SERVER_ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf))); + fprintf(f, "SERVER_ADDRESS=%s\n", IN4_ADDR_TO_STRING(&address)); r = sd_dhcp_lease_get_next_server(lease, &address); if (r >= 0) - fprintf(f, "NEXT_SERVER=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf))); + fprintf(f, "NEXT_SERVER=%s\n", IN4_ADDR_TO_STRING(&address)); r = sd_dhcp_lease_get_broadcast(lease, &address); if (r >= 0) - fprintf(f, "BROADCAST=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf))); + fprintf(f, "BROADCAST=%s\n", IN4_ADDR_TO_STRING(&address)); r = sd_dhcp_lease_get_mtu(lease, &mtu); if (r >= 0) diff --git a/src/libsystemd-network/test-ndisc-rs.c b/src/libsystemd-network/test-ndisc-rs.c index 13db49ea4d..3c679f60b5 100644 --- a/src/libsystemd-network/test-ndisc-rs.c +++ b/src/libsystemd-network/test-ndisc-rs.c @@ -105,7 +105,6 @@ static void router_dump(sd_ndisc_router *rt) { unsigned prefix_len; uint8_t pfl; struct in6_addr a; - char buff[INET6_ADDRSTRLEN]; assert_se(sd_ndisc_router_prefix_get_valid_lifetime(rt, &lifetime_valid) >= 0); log_info("Valid Lifetime: %" PRIu32, lifetime_valid); @@ -122,7 +121,7 @@ static void router_dump(sd_ndisc_router *rt) { log_info("Prefix Length: %u", prefix_len); assert_se(sd_ndisc_router_prefix_get_address(rt, &a) >= 0); - log_info("Prefix: %s", inet_ntop(AF_INET6, &a, buff, sizeof(buff))); + log_info("Prefix: %s", IN6_ADDR_TO_STRING(&a)); break; } @@ -135,10 +134,8 @@ static void router_dump(sd_ndisc_router *rt) { n = sd_ndisc_router_rdnss_get_addresses(rt, &a); assert_se(n > 0); - for (i = 0; i < n; i++) { - char buff[INET6_ADDRSTRLEN]; - log_info("DNS: %s", inet_ntop(AF_INET6, a + i, buff, sizeof(buff))); - } + for (i = 0; i < n; i++) + log_info("DNS: %s", IN6_ADDR_TO_STRING(a + i)); assert_se(sd_ndisc_router_rdnss_get_lifetime(rt, <) >= 0); log_info("Lifetime: %" PRIu32, lt); diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 64233b89c0..ac2a244967 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -192,7 +192,7 @@ static int call_get_addresses( int family; const void *a; size_t sz; - char buf_ifi[DECIMAL_STR_MAX(int) + 2], buffer[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)]; + char buf_ifi[1 + DECIMAL_STR_MAX(int)] = ""; r = sd_bus_message_read(reply, "i", &family); if (r < 0) @@ -204,13 +204,8 @@ static int call_get_addresses( if (family == AF_INET6 && ifi > 0) xsprintf(buf_ifi, "%%%i", ifi); - else - strcpy(buf_ifi, ""); - if (!strextend(&addresses, - prefix, - inet_ntop(family, a, buffer, sizeof(buffer)), - buf_ifi)) + if (!strextend(&addresses, prefix, IN_ADDR_TO_STRING(family, a), buf_ifi)) return log_oom(); r = sd_bus_message_exit_container(reply); From a5b28b772105ca192aab730c6179722e48999ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 4 Jun 2022 20:56:29 +0200 Subject: [PATCH 8/9] CODING_STYLE: say that inet_ntop() is a no no --- docs/CODING_STYLE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/CODING_STYLE.md b/docs/CODING_STYLE.md index 20e7251491..3599db57fb 100644 --- a/docs/CODING_STYLE.md +++ b/docs/CODING_STYLE.md @@ -645,6 +645,11 @@ SPDX-License-Identifier: LGPL-2.1-or-later `uint16_t`. Also, "network byte order" is just a weird name for "big endian", hence we might want to call it "big endian" right-away. +- Use `typesafe_inet_ntop()`, `typesafe_inet_ntop4()`, and + `typesafe_inet_ntop6()` instead of `inet_ntop()`. But better yet, use the + `IN_ADDR_TO_STRING()`, `IN4_ADDR_TO_STRING()`, and `IN6_ADDR_TO_STRING()` + macros which allocate an anynomous buffer internally. + - Please never use `dup()`. Use `fcntl(fd, F_DUPFD_CLOEXEC, 3)` instead. For two reasons: first, you want `O_CLOEXEC` set on the new `fd` (see above). Second, `dup()` will happily duplicate your `fd` as 0, 1, 2, From 89eb3d7c95b8dc3d40471b73699c464994769844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 4 Jun 2022 21:07:27 +0200 Subject: [PATCH 9/9] various: use CONST_MAX for array allocation IIUC, with MAX() we get a VLA and the size is "decided" at runtime, even though the result is always the same, but with CONST_MAX() we get a normal stack variable. --- src/shared/logs-show.c | 2 +- src/test/test-time-util.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index acc1dc9b95..1cd2835816 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -339,7 +339,7 @@ static int output_timestamp_monotonic(FILE *f, sd_journal *j, const char *monoto } static int output_timestamp_realtime(FILE *f, sd_journal *j, OutputMode mode, OutputFlags flags, const char *realtime) { - char buf[MAX(FORMAT_TIMESTAMP_MAX, 64U)]; + char buf[CONST_MAX(FORMAT_TIMESTAMP_MAX, 64U)]; uint64_t x; int r; diff --git a/src/test/test-time-util.c b/src/test/test-time-util.c index 86a60604da..e8e4e2a67b 100644 --- a/src/test/test-time-util.c +++ b/src/test/test-time-util.c @@ -314,7 +314,7 @@ TEST(usec_sub_signed) { TEST(format_timestamp) { for (unsigned i = 0; i < 100; i++) { - char buf[MAX(FORMAT_TIMESTAMP_MAX, FORMAT_TIMESPAN_MAX)]; + char buf[CONST_MAX(FORMAT_TIMESTAMP_MAX, FORMAT_TIMESPAN_MAX)]; usec_t x, y; x = random_u64_range(2147483600 * USEC_PER_SEC) + 1; @@ -374,7 +374,7 @@ TEST(FORMAT_TIMESTAMP) { } TEST(format_timestamp_relative) { - char buf[MAX(FORMAT_TIMESTAMP_MAX, FORMAT_TIMESPAN_MAX)]; + char buf[CONST_MAX(FORMAT_TIMESTAMP_MAX, FORMAT_TIMESPAN_MAX)]; usec_t x; /* Only testing timestamps in the past so we don't need to add some delta to account for time passing