From: Yu Watanabe Date: Wed, 21 Aug 2024 19:11:52 +0000 (+0900) Subject: network/routing-policy-rule: use address family of existing rule when judging if... X-Git-Tag: v257-rc1~656^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=04d10fdb1dd18b946ad26aaa5580bbf25c2561de;p=thirdparty%2Fsystemd.git network/routing-policy-rule: use address family of existing rule when judging if existing rule can be updated Otherwise, the other RoutingPolicyRule object may not have a valid address family yet, and the existing rule may be wrongly handled as that it is not requested by any interface, and it may be removed. Follow-up for 727235006a7e8904f8493d32376cffa6969c5fa9. Fixes #34068. --- diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 44d85d000fe..ea3cb458680 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -351,11 +351,13 @@ static bool routing_policy_rule_equal(const RoutingPolicyRule *a, const RoutingP return routing_policy_rule_compare_func_full(a, b, /* all = */ false) == 0; } -static bool routing_policy_rule_can_update(const RoutingPolicyRule *existing, const RoutingPolicyRule *requesting, int family) { +static bool routing_policy_rule_can_update(const RoutingPolicyRule *existing, const RoutingPolicyRule *requesting) { assert(existing); + assert(IN_SET(existing->family, AF_INET, AF_INET6)); assert(requesting); + assert(IN_SET(requesting->family, AF_INET, AF_INET6) || requesting->address_family == ADDRESS_FAMILY_YES); - if (!routing_policy_rule_equal(existing, requesting, family, existing->priority)) + if (!routing_policy_rule_equal(existing, requesting, existing->family, existing->priority)) return false; /* These flags cannot be updated. */ @@ -791,7 +793,7 @@ static void manager_unmark_routing_policy_rule(Manager *m, const RoutingPolicyRu if (routing_policy_rule_get(m, rule, family, &existing) < 0) return; - if (!routing_policy_rule_can_update(existing, rule, rule->family)) + if (!routing_policy_rule_can_update(existing, rule)) return; routing_policy_rule_unmark(existing);