From 9ee92e7ed8aa9494d963e09099cf3f80f65d3314 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 6 Jun 2019 00:42:05 +0900 Subject: [PATCH] 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. --- src/network/networkd-routing-policy-rule.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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); -- 2.47.3