summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2020-10-03 11:44:42 +0300
committerDavid S. Miller <davem@davemloft.net>2020-10-04 00:18:29 +0300
commit899b07c5787fbc6d2be51d0ea31721c8c2165458 (patch)
treeeffd964f707ecb11e584b9979138bbf5d6dc2458
parent678cdd4967081b3035027b346d10f6f38bf367d2 (diff)
downloadlinux-899b07c5787fbc6d2be51d0ea31721c8c2165458.tar.xz
netlink: compare policy more accurately
The maxtype is really an integral part of the policy, and while we haven't gotten into a situation yet where this happens, it seems that some developer might eventually have two places pointing to identical policies, with different maxattr to exclude some attrs in one of the places. Even if not, it's really the right thing to compare both since the two data items fundamentally belong together. v2: - also do the proper comparison in get_policy_idx() Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/netlink/policy.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/net/netlink/policy.c b/net/netlink/policy.c
index ebc64b20b6ee..753b265acec5 100644
--- a/net/netlink/policy.c
+++ b/net/netlink/policy.c
@@ -35,7 +35,8 @@ static int add_policy(struct netlink_policy_dump_state **statep,
return 0;
for (i = 0; i < state->n_alloc; i++) {
- if (state->policies[i].policy == policy)
+ if (state->policies[i].policy == policy &&
+ state->policies[i].maxtype == maxtype)
return 0;
if (!state->policies[i].policy) {
@@ -63,12 +64,14 @@ static int add_policy(struct netlink_policy_dump_state **statep,
}
static unsigned int get_policy_idx(struct netlink_policy_dump_state *state,
- const struct nla_policy *policy)
+ const struct nla_policy *policy,
+ unsigned int maxtype)
{
unsigned int i;
for (i = 0; i < state->n_alloc; i++) {
- if (state->policies[i].policy == policy)
+ if (state->policies[i].policy == policy &&
+ state->policies[i].maxtype == maxtype)
return i;
}
@@ -182,7 +185,8 @@ send_attribute:
type = NL_ATTR_TYPE_NESTED_ARRAY;
if (pt->nested_policy && pt->len &&
(nla_put_u32(skb, NL_POLICY_TYPE_ATTR_POLICY_IDX,
- get_policy_idx(state, pt->nested_policy)) ||
+ get_policy_idx(state, pt->nested_policy,
+ pt->len)) ||
nla_put_u32(skb, NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE,
pt->len)))
goto nla_put_failure;