From: Yu Watanabe Date: Wed, 5 Jun 2019 15:42:05 +0000 (+0900) Subject: network: check stored object is euivalent to what we want to remove X-Git-Tag: v243-rc1~304^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9ee92e7ed8aa9494d963e09099cf3f80f65d3314;p=thirdparty%2Fsystemd.git network: check stored object is euivalent to what we want to remove When object A is stored in Manager::rules and B is in ::rules_foreign, and compare function for the object cannot distinguish them, then freeing A causes B to be removed from rules_foreign or vice versa. Hopefully fixes #12731. --- diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index a1e56ec4367..faa9f8576c7 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -46,8 +46,10 @@ void routing_policy_rule_free(RoutingPolicyRule *rule) { } if (rule->manager) { - set_remove(rule->manager->rules, rule); - set_remove(rule->manager->rules_foreign, rule); + if (set_get(rule->manager->rules, rule) == rule) + set_remove(rule->manager->rules, rule); + if (set_get(rule->manager->rules_foreign, rule) == rule) + set_remove(rule->manager->rules_foreign, rule); } network_config_section_free(rule->section);