On Mon, 18 Jan 2021 15:05:23 +0100 Petr Machata wrote: > This function uses the global nexthop policy only to then bounce all > arguments except for NHA_ID. Instead, just create a new policy that > only includes the one allowed attribute. > > Signed-off-by: Petr Machata <pe...@nvidia.com> > Reviewed-by: Ido Schimmel <ido...@nvidia.com> > --- > net/ipv4/nexthop.c | 21 ++++++--------------- > 1 file changed, 6 insertions(+), 15 deletions(-) > > diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c > index e53e43aef785..d5d88f7c5c11 100644 > --- a/net/ipv4/nexthop.c > +++ b/net/ipv4/nexthop.c > @@ -36,6 +36,10 @@ static const struct nla_policy rtm_nh_policy[NHA_MAX + 1] > = { > [NHA_FDB] = { .type = NLA_FLAG }, > }; > > +static const struct nla_policy rtm_nh_policy_get[NHA_MAX + 1] = {
This is an unnecessary waste of memory if you ask me. NHA_ID is 1, so we're creating an array of 10 extra NULL elements. Can you leave the size to the compiler and use ARRAY_SIZE() below? > + [NHA_ID] = { .type = NLA_U32 }, > +}; > + > static bool nexthop_notifiers_is_empty(struct net *net) > { > return !net->nexthop.notifier_chain.head; > @@ -1843,27 +1847,14 @@ static int nh_valid_get_del_req(struct nlmsghdr *nlh, > u32 *id, > { > struct nhmsg *nhm = nlmsg_data(nlh); > struct nlattr *tb[NHA_MAX + 1]; > - int err, i; > + int err; > > - err = nlmsg_parse(nlh, sizeof(*nhm), tb, NHA_MAX, rtm_nh_policy, > + err = nlmsg_parse(nlh, sizeof(*nhm), tb, NHA_MAX, rtm_nh_policy_get, > extack); > if (err < 0) > return err; > > err = -EINVAL; > - for (i = 0; i < __NHA_MAX; ++i) { > - if (!tb[i]) > - continue; > - > - switch (i) { > - case NHA_ID: > - break; > - default: > - NL_SET_ERR_MSG_ATTR(extack, tb[i], > - "Unexpected attribute in request"); > - goto out; > - } > - } > if (nhm->nh_protocol || nhm->resvd || nhm->nh_scope || nhm->nh_flags) { > NL_SET_ERR_MSG(extack, "Invalid values in header"); > goto out;