]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev,network: make link_get_type_string() return negative errno on failure
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 12 May 2021 12:07:14 +0000 (21:07 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 May 2021 00:18:29 +0000 (09:18 +0900)
And make net_match_config() propagate the error.

src/libsystemd/sd-network/network-util.c
src/libsystemd/sd-network/network-util.h
src/network/networkctl.c
src/network/networkd-link.c
src/shared/net-condition.c
src/shared/net-condition.h
src/udev/net/link-config.c

index c1d3a9f6a2dd634edc58955319b35e92bc6bfe06..45700983882f0fd94ea1c73b22476a537eda6e74 100644 (file)
@@ -119,24 +119,31 @@ int parse_operational_state_range(const char *str, LinkOperationalStateRange *ou
         return 0;
 }
 
-char *link_get_type_string(sd_device *device, unsigned short iftype) {
+int link_get_type_string(sd_device *device, unsigned short iftype, char **ret) {
         const char *t;
         char *p;
 
         if (device &&
             sd_device_get_devtype(device, &t) >= 0 &&
-            !isempty(t))
-                return strdup(t);
+            !isempty(t)) {
+                p = strdup(t);
+                if (!p)
+                        return -ENOMEM;
+
+                *ret = p;
+                return 0;
+        }
 
         t = arphrd_to_name(iftype);
         if (!t)
-                return NULL;
+                return -ENOENT;
 
         p = strdup(t);
         if (!p)
-                return NULL;
+                return -ENOMEM;
 
-        return ascii_strlower(p);
+        *ret = ascii_strlower(p);
+        return 0;
 }
 
 const char *net_get_name_persistent(sd_device *device) {
index 3bd10c42de8e7dcb0a947e2a89b349dc7bed22c9..d33f42cfb05950d41b3ee184e5eabd04811e945c 100644 (file)
@@ -76,6 +76,6 @@ typedef struct LinkOperationalStateRange {
 
 int parse_operational_state_range(const char *str, LinkOperationalStateRange *out);
 
-char *link_get_type_string(sd_device *device, unsigned short iftype);
+int link_get_type_string(sd_device *device, unsigned short iftype, char **ret);
 int net_get_unique_predictable_data(sd_device *device, bool use_sysname, uint64_t *result);
 const char *net_get_name_persistent(sd_device *device);
index 52abcddd641a0da872d2019ed48e7bb3fa270f3c..d60b75a04597e6f8f7fd93372dec1d2d78f1f049 100644 (file)
@@ -715,7 +715,9 @@ static int list_links(int argc, char *argv[], void *userdata) {
                         setup_state = strdup("unmanaged");
                 setup_state_to_color(setup_state, &on_color_setup, NULL);
 
-                t = link_get_type_string(links[i].sd_device, links[i].iftype);
+                r = link_get_type_string(links[i].sd_device, links[i].iftype, &t);
+                if (r == -ENOMEM)
+                        return log_oom();
 
                 r = table_add_many(table,
                                    TABLE_INT, links[i].ifindex,
@@ -1436,7 +1438,9 @@ static int link_status_one(
                         (void) sd_device_get_property_value(info->sd_device, "ID_MODEL", &model);
         }
 
-        t = link_get_type_string(info->sd_device, info->iftype);
+        r = link_get_type_string(info->sd_device, info->iftype, &t);
+        if (r == -ENOMEM)
+                return log_oom();
 
         (void) sd_network_link_get_network_file(info->ifindex, &network);
 
index 7c24138a4a5332e8f6e655cd8cadac5ea4f093ed..9d30e16b0aae7f50ea631e4d2948fc5ed6836e95 100644 (file)
@@ -2228,6 +2228,7 @@ static int link_configure_continue(Link *link) {
 
 static int link_get_network(Link *link, Network **ret) {
         Network *network;
+        int r;
 
         assert(link);
         assert(link->manager);
@@ -2236,7 +2237,7 @@ static int link_get_network(Link *link, Network **ret) {
         ORDERED_HASHMAP_FOREACH(network, link->manager->networks) {
                 bool warn = false;
 
-                if (!net_match_config(
+                r = net_match_config(
                                 &network->match,
                                 link->sd_device,
                                 &link->hw_addr.addr.ether,
@@ -2247,7 +2248,10 @@ static int link_get_network(Link *link, Network **ret) {
                                 link->alternative_names,
                                 link->wlan_iftype,
                                 link->ssid,
-                                &link->bssid))
+                                &link->bssid);
+                if (r < 0)
+                        return r;
+                if (r == 0)
                         continue;
 
                 if (network->match.ifname && link->sd_device) {
index 2479a5672c5ed1bcb0965165452d5b7bc7c19f04..4742f374474f6bcb3d0bccd78d4ea4af9bfaf198 100644 (file)
@@ -134,7 +134,7 @@ static const char *const wifi_iftype_table[NL80211_IFTYPE_MAX+1] = {
 
 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(wifi_iftype, enum nl80211_iftype);
 
-bool net_match_config(
+int net_match_config(
                 const NetMatch *match,
                 sd_device *device,
                 const struct ether_addr *mac,
@@ -149,10 +149,13 @@ bool net_match_config(
 
         _cleanup_free_ char *iftype_str = NULL;
         const char *path = NULL;
+        int r;
 
         assert(match);
 
-        iftype_str = link_get_type_string(device, iftype);
+        r = link_get_type_string(device, iftype, &iftype_str);
+        if (r == -ENOMEM)
+                return r;
 
         if (device) {
                 const char *mac_str;
index 8d85fc8a7f8311d4f24300f791462e345518a0db..d61537e5e3382760dab41b8fbe476c730145cc29 100644 (file)
@@ -26,7 +26,7 @@ typedef struct NetMatch {
 void net_match_clear(NetMatch *match);
 bool net_match_is_empty(const NetMatch *match);
 
-bool net_match_config(
+int net_match_config(
                 const NetMatch *match,
                 sd_device *device,
                 const struct ether_addr *mac,
index 87afe8383ad17d6fc48427bd2a5c61912ecce8db..3685c9d2280813e8cf60896cf2ef5bd1c6b18398 100644 (file)
@@ -273,16 +273,20 @@ int link_config_get(link_config_ctx *ctx, sd_device *device, link_config **ret)
         (void) link_unsigned_attribute(device, "name_assign_type", &name_assign_type);
 
         LIST_FOREACH(links, link, ctx->links) {
-                if (net_match_config(&link->match, device, NULL, &permanent_mac, NULL, iftype, NULL, NULL, 0, NULL, NULL)) {
-                        if (link->match.ifname && !strv_contains(link->match.ifname, "*") && name_assign_type == NET_NAME_ENUM)
-                                log_device_warning(device, "Config file %s is applied to device based on potentially unpredictable interface name.",
-                                                   link->filename);
-                        else
-                                log_device_debug(device, "Config file %s is applied", link->filename);
-
-                        *ret = link;
-                        return 0;
-                }
+                r = net_match_config(&link->match, device, NULL, &permanent_mac, NULL, iftype, NULL, NULL, 0, NULL, NULL);
+                if (r < 0)
+                        return r;
+                if (r == 0)
+                        continue;
+
+                if (link->match.ifname && !strv_contains(link->match.ifname, "*") && name_assign_type == NET_NAME_ENUM)
+                        log_device_warning(device, "Config file %s is applied to device based on potentially unpredictable interface name.",
+                                           link->filename);
+                else
+                        log_device_debug(device, "Config file %s is applied", link->filename);
+
+                *ret = link;
+                return 0;
         }
 
         return -ENOENT;