]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: check stored object is euivalent to what we want to remove 12738/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 5 Jun 2019 15:42:05 +0000 (00:42 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 5 Jun 2019 15:45:46 +0000 (00:45 +0900)
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

index a1e56ec43679f2a6e88f165c2c2d14aedb4fc6db..faa9f8576c71e35b5a983e0e1a8c85b8cf63a239 100644 (file)
@@ -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);