From 6b5598b0036914d331849d522df207f1ff755bcd Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Wed, 20 Dec 2017 20:39:31 +0530 Subject: [PATCH] Fix #7704 and #7708. Init rule variable iif oif and to, from While foreign rules are added the network part is not attached. attach manager to rules and use it in routing_policy_rule_free. --- src/network/networkd-manager.c | 4 ++-- src/network/networkd-route.h | 1 + src/network/networkd-routing-policy-rule.c | 17 ++++++++++------- src/network/networkd-routing-policy-rule.h | 2 ++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index cc17af9391be6..186f9ce33ea25 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -726,11 +726,11 @@ static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *messa int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) { uint8_t tos = 0, to_prefixlen = 0, from_prefixlen = 0; + union in_addr_union to = {}, from = {}; RoutingPolicyRule *rule = NULL; - union in_addr_union to, from; uint32_t fwmark = 0, table = 0; + char *iif = NULL, *oif = NULL; Manager *m = userdata; - char *iif, *oif; uint16_t type; int family; int r; diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index cfb85cbd6d371..cde31c96633b9 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -26,6 +26,7 @@ typedef struct NetworkConfigSection NetworkConfigSection; #include "networkd-network.h" struct Route { + Manager *m; Network *network; NetworkConfigSection *section; diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 1314564c1107a..1019b39807794 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -60,10 +60,11 @@ void routing_policy_rule_free(RoutingPolicyRule *rule) { network_config_section_free(rule->section); } - if (rule->network->manager) { - set_remove(rule->network->manager->rules, rule); - set_remove(rule->network->manager->rules_foreign, rule); - } + } + + if (rule->m) { + set_remove(rule->m->rules, rule); + set_remove(rule->m->rules_foreign, rule); } free(rule->iif); @@ -236,7 +237,8 @@ int routing_policy_rule_make_local(Manager *m, RoutingPolicyRule *rule) { return -ENOENT; } -static int routing_policy_rule_add_internal(Set **rules, +static int routing_policy_rule_add_internal(Manager *m, + Set **rules, int family, const union in_addr_union *from, uint8_t from_prefixlen, @@ -258,6 +260,7 @@ static int routing_policy_rule_add_internal(Set **rules, if (r < 0) return r; + rule->m = m; rule->family = family; rule->from = *from; rule->from_prefixlen = from_prefixlen; @@ -298,7 +301,7 @@ int routing_policy_rule_add(Manager *m, char *oif, RoutingPolicyRule **ret) { - return routing_policy_rule_add_internal(&m->rules, family, from, from_prefixlen, to, to_prefixlen, tos, fwmark, table, iif, oif, ret); + return routing_policy_rule_add_internal(m, &m->rules, family, from, from_prefixlen, to, to_prefixlen, tos, fwmark, table, iif, oif, ret); } int routing_policy_rule_add_foreign(Manager *m, @@ -313,7 +316,7 @@ int routing_policy_rule_add_foreign(Manager *m, char *iif, char *oif, RoutingPolicyRule **ret) { - return routing_policy_rule_add_internal(&m->rules_foreign, family, from, from_prefixlen, to, to_prefixlen, tos, fwmark, table, iif, oif, ret); + return routing_policy_rule_add_internal(m, &m->rules_foreign, family, from, from_prefixlen, to, to_prefixlen, tos, fwmark, table, iif, oif, ret); } static int routing_policy_rule_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) { diff --git a/src/network/networkd-routing-policy-rule.h b/src/network/networkd-routing-policy-rule.h index 70a861723bb9b..a56a2a52ef451 100644 --- a/src/network/networkd-routing-policy-rule.h +++ b/src/network/networkd-routing-policy-rule.h @@ -33,8 +33,10 @@ typedef struct RoutingPolicyRule RoutingPolicyRule; typedef struct Network Network; typedef struct Link Link; typedef struct NetworkConfigSection NetworkConfigSection; +typedef struct Manager Manager; struct RoutingPolicyRule { + Manager *m; Network *network; Link *link; NetworkConfigSection *section;