diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/fib_frontend.c | 5 | ||||
-rw-r--r-- | net/ipv4/fib_rules.c | 14 | ||||
-rw-r--r-- | net/ipv4/fib_semantics.c | 2 | ||||
-rw-r--r-- | net/ipv4/fib_trie.c | 9 |
4 files changed, 21 insertions, 9 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 1fba6439fc57..fc920f63452b 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
@@ -493,6 +493,11 @@ static int rtm_to_fib_config(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
493 | cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid; | 493 | cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid; |
494 | cfg->fc_nlinfo.nlh = nlh; | 494 | cfg->fc_nlinfo.nlh = nlh; |
495 | 495 | ||
496 | if (cfg->fc_type > RTN_MAX) { | ||
497 | err = -EINVAL; | ||
498 | goto errout; | ||
499 | } | ||
500 | |||
496 | nlmsg_for_each_attr(attr, nlh, sizeof(struct rtmsg), remaining) { | 501 | nlmsg_for_each_attr(attr, nlh, sizeof(struct rtmsg), remaining) { |
497 | switch (attr->nla_type) { | 502 | switch (attr->nla_type) { |
498 | case RTA_DST: | 503 | case RTA_DST: |
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index b837c33e0404..c660c074c76c 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
@@ -171,8 +171,6 @@ static struct fib_table *fib_empty_table(void) | |||
171 | 171 | ||
172 | static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = { | 172 | static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = { |
173 | FRA_GENERIC_POLICY, | 173 | FRA_GENERIC_POLICY, |
174 | [FRA_SRC] = { .type = NLA_U32 }, | ||
175 | [FRA_DST] = { .type = NLA_U32 }, | ||
176 | [FRA_FLOW] = { .type = NLA_U32 }, | 174 | [FRA_FLOW] = { .type = NLA_U32 }, |
177 | }; | 175 | }; |
178 | 176 | ||
@@ -183,8 +181,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
183 | int err = -EINVAL; | 181 | int err = -EINVAL; |
184 | struct fib4_rule *rule4 = (struct fib4_rule *) rule; | 182 | struct fib4_rule *rule4 = (struct fib4_rule *) rule; |
185 | 183 | ||
186 | if (frh->src_len > 32 || frh->dst_len > 32 || | 184 | if (frh->tos & ~IPTOS_TOS_MASK) |
187 | (frh->tos & ~IPTOS_TOS_MASK)) | ||
188 | goto errout; | 185 | goto errout; |
189 | 186 | ||
190 | if (rule->table == RT_TABLE_UNSPEC) { | 187 | if (rule->table == RT_TABLE_UNSPEC) { |
@@ -201,10 +198,10 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
201 | } | 198 | } |
202 | } | 199 | } |
203 | 200 | ||
204 | if (tb[FRA_SRC]) | 201 | if (frh->src_len) |
205 | rule4->src = nla_get_be32(tb[FRA_SRC]); | 202 | rule4->src = nla_get_be32(tb[FRA_SRC]); |
206 | 203 | ||
207 | if (tb[FRA_DST]) | 204 | if (frh->dst_len) |
208 | rule4->dst = nla_get_be32(tb[FRA_DST]); | 205 | rule4->dst = nla_get_be32(tb[FRA_DST]); |
209 | 206 | ||
210 | #ifdef CONFIG_NET_CLS_ROUTE | 207 | #ifdef CONFIG_NET_CLS_ROUTE |
@@ -242,10 +239,10 @@ static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, | |||
242 | return 0; | 239 | return 0; |
243 | #endif | 240 | #endif |
244 | 241 | ||
245 | if (tb[FRA_SRC] && (rule4->src != nla_get_be32(tb[FRA_SRC]))) | 242 | if (frh->src_len && (rule4->src != nla_get_be32(tb[FRA_SRC]))) |
246 | return 0; | 243 | return 0; |
247 | 244 | ||
248 | if (tb[FRA_DST] && (rule4->dst != nla_get_be32(tb[FRA_DST]))) | 245 | if (frh->dst_len && (rule4->dst != nla_get_be32(tb[FRA_DST]))) |
249 | return 0; | 246 | return 0; |
250 | 247 | ||
251 | return 1; | 248 | return 1; |
@@ -309,6 +306,7 @@ static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule) | |||
309 | static struct fib_rules_ops fib4_rules_ops = { | 306 | static struct fib_rules_ops fib4_rules_ops = { |
310 | .family = AF_INET, | 307 | .family = AF_INET, |
311 | .rule_size = sizeof(struct fib4_rule), | 308 | .rule_size = sizeof(struct fib4_rule), |
309 | .addr_size = sizeof(u32), | ||
312 | .action = fib4_rule_action, | 310 | .action = fib4_rule_action, |
313 | .match = fib4_rule_match, | 311 | .match = fib4_rule_match, |
314 | .configure = fib4_rule_configure, | 312 | .configure = fib4_rule_configure, |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 2f1fdae6efa6..3dad12ee76c3 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -89,7 +89,7 @@ static const struct | |||
89 | { | 89 | { |
90 | int error; | 90 | int error; |
91 | u8 scope; | 91 | u8 scope; |
92 | } fib_props[RTA_MAX + 1] = { | 92 | } fib_props[RTN_MAX + 1] = { |
93 | { | 93 | { |
94 | .error = 0, | 94 | .error = 0, |
95 | .scope = RT_SCOPE_NOWHERE, | 95 | .scope = RT_SCOPE_NOWHERE, |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ada9b3db507d..214c34732e84 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -1123,6 +1123,9 @@ err: | |||
1123 | return fa_head; | 1123 | return fa_head; |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | /* | ||
1127 | * Caller must hold RTNL. | ||
1128 | */ | ||
1126 | static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg) | 1129 | static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg) |
1127 | { | 1130 | { |
1128 | struct trie *t = (struct trie *) tb->tb_data; | 1131 | struct trie *t = (struct trie *) tb->tb_data; |
@@ -1540,6 +1543,9 @@ static int trie_leaf_remove(struct trie *t, t_key key) | |||
1540 | return 1; | 1543 | return 1; |
1541 | } | 1544 | } |
1542 | 1545 | ||
1546 | /* | ||
1547 | * Caller must hold RTNL. | ||
1548 | */ | ||
1543 | static int fn_trie_delete(struct fib_table *tb, struct fib_config *cfg) | 1549 | static int fn_trie_delete(struct fib_table *tb, struct fib_config *cfg) |
1544 | { | 1550 | { |
1545 | struct trie *t = (struct trie *) tb->tb_data; | 1551 | struct trie *t = (struct trie *) tb->tb_data; |
@@ -1718,6 +1724,9 @@ up: | |||
1718 | return NULL; /* Ready. Root of trie */ | 1724 | return NULL; /* Ready. Root of trie */ |
1719 | } | 1725 | } |
1720 | 1726 | ||
1727 | /* | ||
1728 | * Caller must hold RTNL. | ||
1729 | */ | ||
1721 | static int fn_trie_flush(struct fib_table *tb) | 1730 | static int fn_trie_flush(struct fib_table *tb) |
1722 | { | 1731 | { |
1723 | struct trie *t = (struct trie *) tb->tb_data; | 1732 | struct trie *t = (struct trie *) tb->tb_data; |