network: remove routing policy rule from foreign rule database when it is removed
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 22 Feb 2019 04:27:44 +0000 (13:27 +0900)
committerMichael Biebl <biebl@debian.org>
Sat, 24 Oct 2020 18:44:48 +0000 (19:44 +0100)
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.

(cherry picked from commit 92cd00b9749141907a1110044cc7d1f01caff545)

Gbp-Pq: Name network-remove-routing-policy-rule-from-foreign-rule-data.patch

src/network/networkd-routing-policy-rule.c

index 2dc78622cecf9a7853b7a86271f8c100d6ae00ac..21a40fa7aa7966dd43ddf623b5e7b52da73ca557 100644 (file)
@@ -1260,15 +1260,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);
         }
 }