From 75a302b56155551647760d2e04fe6fd6fceadc15 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Aug 2019 08:56:37 +0900 Subject: network: fix potential memleaks related to set_put() --- src/network/networkd-address.c | 2 ++ src/network/networkd-link.c | 2 ++ src/network/networkd-route.c | 2 ++ src/network/networkd-routing-policy-rule.c | 12 +++++++++--- 4 files changed, 15 insertions(+), 3 deletions(-) (limited to 'src/network') diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index a207bb0790..e6f30a2842 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -260,6 +260,8 @@ static int address_add_internal(Link *link, Set **addresses, r = set_put(*addresses, address); if (r < 0) return r; + if (r == 0) + return -EEXIST; address->link = link; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 5c0149492f..6bcb078808 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1945,6 +1945,8 @@ static int link_append_to_master(Link *link, NetDev *netdev) { r = set_put(master->slaves, link); if (r < 0) return r; + if (r == 0) + return 0; link_ref(link); return 0; diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 8cc8080b46..8a16e9111f 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -399,6 +399,8 @@ static int route_add_internal( r = set_put(*routes, route); if (r < 0) return r; + if (r == 0) + return -EEXIST; route->link = link; diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 31a49ed905..1864a5a376 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -209,7 +209,11 @@ int routing_policy_rule_make_local(Manager *m, RoutingPolicyRule *rule) { if (r < 0) return r; - return set_put(m->rules, rule); + r = set_put(m->rules, rule); + if (r < 0) + return r; + if (r == 0) + routing_policy_rule_free(rule); } return -ENOENT; @@ -265,6 +269,8 @@ static int routing_policy_rule_add_internal(Manager *m, Set **rules, RoutingPoli r = set_put(*rules, rule); if (r < 0) return r; + if (r == 0) + return -EEXIST; if (ret) *ret = rule; @@ -1180,8 +1186,8 @@ int routing_policy_load_rules(const char *state_file, Set **rules) { log_warning_errno(r, "Failed to add RPDB rule to saved DB, ignoring: %s", p); continue; } - - rule = NULL; + if (r > 0) + rule = NULL; } return 0; -- cgit v1.2.1 From 3dc2e7af5fc9d045416f8f6dc3f76799af7eb204 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Aug 2019 09:11:20 +0900 Subject: network: add missing link_ref() --- src/network/networkd-link.c | 4 ++++ src/network/networkd-manager.c | 2 ++ 2 files changed, 6 insertions(+) (limited to 'src/network') diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6bcb078808..a813fca565 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2688,6 +2688,8 @@ int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_error *re configure: while ((link = set_steal_first(manager->links_requesting_uuid))) { + link_unref(link); + r = link_configure(link); if (r < 0) link_enter_failed(link); @@ -2760,6 +2762,8 @@ static int link_configure_duid(Link *link) { r = set_put(m->duids_requesting_uuid, duid); if (r < 0) return log_oom(); + + link_ref(link); } return 0; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 74266ff12a..fe7c388826 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -1818,6 +1818,8 @@ int manager_request_product_uuid(Manager *m, Link *link) { r = set_put(m->duids_requesting_uuid, duid); if (r < 0) return log_oom(); + + link_ref(link); } if (!m->bus || sd_bus_is_ready(m->bus) <= 0) { -- cgit v1.2.1