From 75a302b56155551647760d2e04fe6fd6fceadc15 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Aug 2019 08:56:37 +0900 Subject: [PATCH] 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(-) 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;