]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: refuse the case To= and From= are in different address family
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 1 Aug 2019 20:07:40 +0000 (05:07 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 16 Aug 2019 13:01:17 +0000 (22:01 +0900)
src/network/networkd-network.c
src/network/networkd-routing-policy-rule.c
src/network/networkd-routing-policy-rule.h

index 9d3c383378e6d59494c6770cedc3a3e6c8b3fe58..191e766a925819e12871123f68a515212530a983 100644 (file)
@@ -281,7 +281,7 @@ int network_verify(Network *network) {
                         prefix_free(prefix);
 
         LIST_FOREACH_SAFE(rules, rule, rule_next, network->rules)
-                if (section_is_invalid(rule->section))
+                if (routing_policy_rule_section_verify(rule) < 0)
                         routing_policy_rule_free(rule);
 
         return 0;
index 1864a5a376d46f3a199a35082825eed48d559706..857b01468fa3f459310eb2114d135c0be8a2a042 100644 (file)
@@ -23,7 +23,6 @@ int routing_policy_rule_new(RoutingPolicyRule **ret) {
                 return -ENOMEM;
 
         *rule = (RoutingPolicyRule) {
-                .family = AF_INET,
                 .table = RT_TABLE_MAIN,
         };
 
@@ -555,6 +554,16 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl
         return 1;
 }
 
+int routing_policy_rule_section_verify(RoutingPolicyRule *rule) {
+        if (section_is_invalid(rule->section))
+                return -EINVAL;
+
+        if (rule->family == AF_UNSPEC)
+                rule->family = AF_INET;
+
+        return 0;
+}
+
 static int parse_fwmark_fwmask(const char *s, uint32_t *fwmark, uint32_t *fwmask) {
         _cleanup_free_ char *f = NULL;
         char *p;
@@ -767,7 +776,10 @@ int config_parse_routing_policy_rule_prefix(
                 prefixlen = &n->from_prefixlen;
         }
 
-        r = in_addr_prefix_from_string_auto(rvalue, &n->family, buffer, prefixlen);
+        if (n->family == AF_UNSPEC)
+                r = in_addr_prefix_from_string_auto(rvalue, &n->family, buffer, prefixlen);
+        else
+                r = in_addr_prefix_from_string(rvalue, n->family, buffer, prefixlen);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "RPDB rule prefix is invalid, ignoring assignment: %s", rvalue);
                 return 0;
index 512af3dfdd41059537cdccd8b19093c9f13f9dc6..8ddb85307c4058082b26c3c3698abdc216ca4aa8 100644 (file)
@@ -56,6 +56,7 @@ int routing_policy_rule_new(RoutingPolicyRule **ret);
 void routing_policy_rule_free(RoutingPolicyRule *rule);
 
 DEFINE_NETWORK_SECTION_FUNCTIONS(RoutingPolicyRule, routing_policy_rule_free);
+int routing_policy_rule_section_verify(RoutingPolicyRule *rule);
 
 int routing_policy_rule_configure(RoutingPolicyRule *address, Link *link, link_netlink_message_handler_t callback);
 int routing_policy_rule_remove(RoutingPolicyRule *routing_policy_rule, Link *link, link_netlink_message_handler_t callback);