summaryrefslogtreecommitdiff
path: root/src/network/networkd-manager.c
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-02-18 21:42:05 +0100
committerTom Gundersen <teg@jklm.no>2014-02-18 22:34:26 +0100
commit11a7f22939d21558df919cab44b8fbe36ab5dae0 (patch)
treeca9d1173cd160446c1b761d807fea4972cc87b87 /src/network/networkd-manager.c
parent3302da4667640ac130956d8d90be7c39fb39222f (diff)
networkd: refactor link_add() :(
Don't set set **ret when returning r < 0, as matching on the errno may easily give false positives in the future leading to null pointer dereference. Reported-by: David Herrmann <dh.herrmann@gmail.com>
Diffstat (limited to 'src/network/networkd-manager.c')
-rw-r--r--src/network/networkd-manager.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index c1ad69bf51..f817d698c4 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -145,30 +145,31 @@ bool manager_should_reload(Manager *m) {
}
static int manager_process_link(Manager *m, struct udev_device *device) {
- Link *link;
+ Link *link = NULL;
int r;
- if (streq_ptr(udev_device_get_action(device), "remove")) {
- uint64_t ifindex;
+ assert(m);
+ assert(device);
+ link_get(m, udev_device_get_ifindex(device), &link);
+
+ if (streq_ptr(udev_device_get_action(device), "remove")) {
log_debug("%s: link removed", udev_device_get_sysname(device));
- ifindex = udev_device_get_ifindex(device);
- link = hashmap_get(m->links, &ifindex);
- if (!link)
+ if (link)
+ link_free(link);
+ } else {
+ if (link) {
+ log_debug("%s: link already exists, ignoring",
+ link->ifname);
return 0;
+ }
- link_free(link);
- } else {
r = link_add(m, device, &link);
if (r < 0) {
- if (r == -EEXIST)
- log_debug("%s: link already exists, ignoring",
- link->ifname);
- else
- log_error("%s: could not handle link: %s",
- udev_device_get_sysname(device),
- strerror(-r));
+ log_error("%s: could not handle link: %s",
+ udev_device_get_sysname(device),
+ strerror(-r));
} else
log_debug("%s: link (with ifindex %" PRIu64") added",
link->ifname, link->ifindex);
@@ -264,9 +265,12 @@ static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, vo
Manager *m = userdata;
Link *link;
const char *name;
- uint64_t ifindex_64;
int r, ifindex;
+ assert(rtnl);
+ assert(message);
+ assert(m);
+
r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
if (r < 0 || ifindex <= 0) {
log_debug("received RTM_NEWLINK message without valid ifindex");
@@ -288,9 +292,8 @@ static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, vo
}
}
- ifindex_64 = ifindex;
- link = hashmap_get(m->links, &ifindex_64);
- if (!link) {
+ r = link_get(m, ifindex, &link);
+ if (r < 0) {
log_debug("received RTM_NEWLINK message for untracked ifindex %d", ifindex);
return 0;
}