From f63e09ef752ab0a4ad75c41246dc3a9a07eef2d8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 24 Nov 2020 15:58:04 +0900 Subject: [PATCH 1/2] network: use bus_error_message() --- src/network/networkd-dhcp-common.c | 13 ++++++++----- src/network/networkd-manager.c | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index 904cb34d13..4dd98a2c61 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -3,6 +3,7 @@ #include #include +#include "bus-error.h" #include "dhcp-internal.h" #include "dhcp6-internal.h" #include "escape.h" @@ -99,18 +100,20 @@ static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_er e = sd_bus_message_get_error(m); if (e) { - log_error_errno(sd_bus_error_get_errno(e), - "Could not get product UUID. Falling back to use machine-app-specific ID as DUID-UUID: %s", - e->message); + r = sd_bus_error_get_errno(e); + log_warning_errno(r, "Could not get product UUID. Falling back to use machine-app-specific ID as DUID-UUID: %s", + bus_error_message(e, r)); goto configure; } r = sd_bus_message_read_array(m, 'y', &a, &sz); - if (r < 0) + if (r < 0) { + log_warning_errno(r, "Failed to get product UUID. Falling back to use machine-app-specific ID as DUID-UUID: %m"); goto configure; + } if (sz != sizeof(sd_id128_t)) { - log_error("Invalid product UUID. Falling back to use machine-app-specific ID as DUID-UUID."); + log_warning("Invalid product UUID. Falling back to use machine-app-specific ID as DUID-UUID."); goto configure; } diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index e8b6615afa..a10860b63b 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -11,6 +11,7 @@ #include "sd-netlink.h" #include "alloc-util.h" +#include "bus-error.h" #include "bus-log-control-api.h" #include "bus-polkit.h" #include "bus-util.h" @@ -1157,15 +1158,16 @@ void manager_dirty(Manager *manager) { } static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { - _unused_ Manager *manager = userdata; const sd_bus_error *e; + int r; assert(m); - assert(manager); e = sd_bus_message_get_error(m); - if (e) - log_warning_errno(sd_bus_error_get_errno(e), "Could not set hostname: %s", e->message); + if (e) { + r = sd_bus_error_get_errno(e); + log_warning_errno(r, "Could not set hostname: %s", bus_error_message(e, r)); + } return 1; } @@ -1203,15 +1205,16 @@ int manager_set_hostname(Manager *m, const char *hostname) { } static int set_timezone_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { - _unused_ Manager *manager = userdata; const sd_bus_error *e; + int r; assert(m); - assert(manager); e = sd_bus_message_get_error(m); - if (e) - log_warning_errno(sd_bus_error_get_errno(e), "Could not set timezone: %s", e->message); + if (e) { + r = sd_bus_error_get_errno(e); + log_warning_errno(r, "Could not set timezone: %s", bus_error_message(e, r)); + } return 1; } From 59c31eba497164d7d1bd1271af8798008ae60e9a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 24 Nov 2020 15:47:13 +0900 Subject: [PATCH 2/2] network: stop to assign UUID when reconfiguring link This fixes the following race in reconfiguring link: 1. an interface requests UUID. 2. the interface is reconfigured and link_configure() is called. 3. sd-lldp client is started on the interface (it is enabled by default). 4. networkd acquires UUID, and get_product_uuid_handler() calls link_configure() for the link again. 5. link_lldp_rx_configure() fails to set ifindex for already running sd-lldp client. 6. the link enters failed state. --- src/network/networkd-link.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 2b7055dd0f..547f3bbc01 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2172,6 +2172,7 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for link_free_carrier_maps(link); link_free_engines(link); link->network = network_unref(link->network); + link_unref(set_remove(link->manager->links_requesting_uuid, link)); /* Then, apply new .network file */ r = network_apply(network, link);