From 92cd00b9749141907a1110044cc7d1f01caff545 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 22 Feb 2019 13:27:44 +0900 Subject: [PATCH] network: remove routing policy rule from foreign rule database when it is removed Previously, When the first link configures rules, it removes all saved rules, which were configured by networkd previously, in the foreign rule database, but the rules themselves are still in the database. Thus, when the second or later link configures rules, it errnously treats the rules already exist. This is the root of issue #11280. This removes rules from the foreign database when they are removed. Fixes #11280. --- src/network/networkd-routing-policy-rule.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index dd155748177..3941245733f 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -1244,15 +1244,18 @@ void routing_policy_rule_purge(Manager *m, Link *link) { SET_FOREACH(rule, m->rules_saved, i) { existing = set_get(m->rules_foreign, rule); - if (existing) { + if (!existing) + continue; /* Saved rule does not exist anymore. */ - r = routing_policy_rule_remove(rule, link, NULL); - if (r < 0) { - log_warning_errno(r, "Could not remove routing policy rules: %m"); - continue; - } - - link->routing_policy_rule_remove_messages++; + r = routing_policy_rule_remove(existing, link, NULL); + if (r < 0) { + log_warning_errno(r, "Could not remove routing policy rules: %m"); + continue; } + + link->routing_policy_rule_remove_messages++; + + assert_se(set_remove(m->rules_foreign, existing) == existing); + routing_policy_rule_free(existing); } } -- 2.39.2