diff options
author | Tom Gundersen <teg@jklm.no> | 2013-11-21 21:04:04 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2013-11-21 21:04:04 +0100 |
commit | 5a3eb5a77d7c491a31818c4dfdcf8fd7dcaaadb2 (patch) | |
tree | cc860127113bc99e7907998995e7765ee7418726 | |
parent | 602cc437e8b4a3ab760b5a23fa4f3112134d9c36 (diff) |
networkd: make sure Network and Link can always be freed
Also, don't fail a link just because we can't find its MAC address.
-rw-r--r-- | src/network/networkd-link.c | 19 | ||||
-rw-r--r-- | src/network/networkd-network.c | 4 |
2 files changed, 10 insertions, 13 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index c03472216c..b93df63f21 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -39,22 +39,19 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) { if (!link) return -ENOMEM; + link->manager = manager; + link->state = _LINK_STATE_INVALID; + link->ifindex = udev_device_get_ifindex(device); if (link->ifindex <= 0) return -EINVAL; mac = udev_device_get_sysattr_value(device, "address"); - if (!mac) - return -EINVAL; - - mac_addr = ether_aton(mac); - if (!mac_addr) - return -EINVAL; - - memcpy(&link->mac, mac_addr, sizeof(struct ether_addr)); - - link->manager = manager; - link->state = _LINK_STATE_INVALID; + if (mac) { + mac_addr = ether_aton(mac); + if (mac_addr) + memcpy(&link->mac, mac_addr, sizeof(struct ether_addr)); + } r = hashmap_put(manager->links, &link->ifindex, link); if (r < 0) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index d4239ab8d0..7be9645d59 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -42,6 +42,8 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network) return log_oom(); + network->manager = manager; + LIST_HEAD_INIT(network->addresses); r = config_parse(NULL, filename, file, "Match\0Network\0", config_item_perf_lookup, @@ -56,8 +58,6 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network->filename) return log_oom(); - network->manager = manager; - LIST_PREPEND(networks, manager->networks, network); network = NULL; |